简化Java中的synchronized块

时间:2016-10-30 13:17:45

标签: java multithreading synchronized synchronized-block

我在Java中使用synchronized块的概念时遇到了一些麻烦。我觉得我已经很好地理解了同步方法。所以我想到了一个类比来帮助我理解同步方法中的同步块。如果我提出的这种等同性是正确的,请告诉我。另外,我现在只提到了非静态同步块。但是,也欢迎静态同步块上的点。

<source>

相当于

public void method() 
{
    //code snipppet A

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

在objRef类中:

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

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

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

您应该注意到two types of synchronized block in 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();}