0

我在理解 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 类中:

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

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

4

2 回答 2

2

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

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

不等于

objRef.sync_method();

因为在前一种情况下,锁覆盖了大部分代码。之间存在等价性

synchronized void sync_method() {
    // stuff
}

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

更远,

一旦一个线程在监视器上获得了锁,它就不允许其他线程干扰它的执行

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

int i;

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

void nonsync_method() {
    i = 42;
}

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

于 2016-10-30T13:56:24.340 回答
1

您应该注意到Java 中有两种类型的同步块(对象同步和类同步)。有两种同步方法(静态和非静态方法)及其等效的同步块(分别为类和对象同步块)。假设我们有:

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.类同步:

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

相当于

   public void method() {MyClass.syncStaticMethod();}
于 2016-10-30T13:48:01.423 回答