通过这个 vs 虚拟对象同步

synchronizing by this vs dummy object

到目前为止我已经看到了同步块的用法,但最近我了解到最好使用虚拟对象。我发现了以下与此相关的主题。

Java synchronized method lock on object, or method?

总而言之,在下面的代码中,两个不同的对象不能同时 运行 addA 和 addB,因为它们都使用 this 作为锁。

private int a;
private int b;

public synchronized void addA(){
    a++;
}

public synchronized void addB(){
    b++;
}

如果我使用虚拟对象进行锁定,我会感到困惑,如果我在两种方法中使用下面的行进行同步,会有什么不同?因为他们仍然会有相同的锁。

synchronized(dummyObject){
    ...
}

那我应该为每个方法使用两个不同的虚拟对象以与同步为一起使用是什么意思?

 public void addA(){
    synchronized(dummyObj1){
       a++;
    }
}

public void addB(){
    synchronized(dummyObj2){
       b++;
    }
}

这正是锁对象的意义所在——您可以为不同的操作使用不同的锁。假设同时 运行 addAaddB 有意义(并且从它的外观来看 - 它确实如此),你确实应该有两个单独的锁,每个方法一个。

你是对的。在这种情况下,您需要两个不同的对象来分别同步它们。

出于锁定目的,最简单的方法是创建 Object 个对象。

Object lock1 = new Object();
Object lock2 = new Object();