到目前为止,我已经看到了使用synchronized块,但最近我了解到使用虚拟对象更可取。我发现了以下与此相关的主题。
Java synchronized method lock on object, or method?
总结一下,在下面的代码中,两个不同的对象不能同时运行addA和addB,因为它们都使用它来锁定。
private int a;
private int b;
public synchronized void addA(){
a++;
}
public synchronized void addB(){
b++;
}
如果我使用虚拟对象进行锁定,我会感到困惑,如果我在两种方法中同时使用下面的行,会有什么不同?因为他们仍然会有同样的锁定。
synchronized(dummyObject){
...
}
那么对于每个与sycnhronized一起使用的方法,我应该有两个不同的虚拟对象意味着什么?
public void addA(){
synchronized(dummyObj1){
a++;
}
}
public void addB(){
synchronized(dummyObj2){
b++;
}
}
答案 0 :(得分:2)
这正是锁定对象的关键点 - 您可以为不同的操作使用不同的锁。假设同时运行addA
和addB
是有意义的(并且从它的外观 - 它肯定会这样做),你应该确实有两个单独的锁,每个方法一个。
答案 1 :(得分:0)
你是对的。在这种情况下,您需要两个不同的对象来分别同步它们。
出于锁定目的,最简单的方法是创建Object
个对象。
Object lock1 = new Object();
Object lock2 = new Object();