Java 中同步块的简化

Simplification of synchronized block in Java

我在理解 Java 中同步块的概念时遇到了一些麻烦。我觉得我已经足够了解同步方法了。所以我想到了一个类比来帮助我从同步方法的角度来理解同步块。请让我知道我提出的这个等效性是否正确。另外,我现在只针对非静态同步块提到了这一点。但是,也欢迎对静态同步块的点数。

public void method() 
{
    //code snipppet A

synchronized(objRef) 
{ 
    //code snipppet B
}
    //code snipppet C
}

相当于

public void method() {
//code snippet A
objRef.sync_method();
//code snippet C
}

在 objRef 的 class 中:

public synchronized void sync_method() {
//code snippet B
}

这个类比是基于同步块的行为与同步方法一样的逻辑。这意味着一旦一个线程获得了监视器上的锁,它就不允许其他线程干扰它的执行。只有在执行完整个同步方法后,线程才会放弃控制权。

您应该注意到有 two types of synchronized block in Java(对象同步和 class 同步)。有两种同步方法(静态和非静态方法)及其等效的同步块(分别为 Class 和 Object Synchronized 块)。 假设我们有:

class MyClass{
public synchronized static void syncStaticMethod(){...}
public synchronized void syncNonStaticMethod(){...}
}


MyClass objRef = new MyClass();

1.对象同步:

public void method() {synchronized(objRef) { ... }}

相当于

 public void method() {objRef.syncNonStaticMethod();}

2。 Class同步:

 public void method() {synchronized(MyClass.class) { ... }}

相当于

   public void method() {MyClass.syncStaticMethod();}

您可能没有把所有事情都做对。例如,

synchronized(objRef) {
    objRef.nonsync_method();
    ... more code ...
}

不等同于

objRef.sync_method();

因为在前一种情况下,锁覆盖了大部分代码。

之间存在等价关系
synchronized void sync_method() {
    // stuff
}

void nonsync_method() {
    synchronized (this) {
        // stuff
    }
}

此外,

once a thread acquires a lock on the monitor, it does not allow other threads to interfere in its execution

以上说法可能正确也可能不正确,这取决于我们如何解释模棱两可的措辞。获得锁的线程可能很容易让其他线程干扰它的执行:它所需要的只是另一段没有被完全相同的锁覆盖的代码。例如,

int i;

synchronized void sync_method() {
    i = 0;
    System.out.println(i);
}

void nonsync_method() {
    i = 42;
}

调用sync_method()可以同时打印0和42。