java-通过此vs虚拟对象进行同步

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

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 as一起使用的方法,我应该有两个不同的虚拟对象?

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

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

解决方法:

这正是锁定对象的重点-您可以对不同的操作使用不同的锁定.假设同时运行addA和addB是有意义的(从它的外观上确实可以做到),则确实应该有两个单独的锁,每个方法一个.

上一篇:java – 同步方法的weakValue映射引用中的内存泄漏


下一篇:[TLPI] C30 Threads: Thread Synchronization