java - 通过此与虚拟对象同步

标签 java multithreading synchronization thread-safety synchronized

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

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){
    ...
}

那么我应该为每个方法使用两个不同的虚拟对象来与 sycnhronized as 一起使用,这意味着什么?

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

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

最佳答案

这正是锁对象的要点 - 您可以对不同的操作使用不同的锁。假设同时运行 addAaddB 是有意义的(从表面上看 - 确实如此),您确实应该有两个单独的锁,每个方法一个。

关于java - 通过此与虚拟对象同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41506470/

相关文章:

java - 如何从 3 个整数组成 HashMap 的键?

windows - 仅在一个处理器上运行的进程是否可以在其他处理器上运行线程?

c++ - c++ 是否存在多生产者单消费者无锁队列?

Python threading.thread.start() 不会将控制权返回给主线程

c# backgroundWorker 不引发 ProgressChanged 或 RunWorkerCompleted 事件

java - java中的线程同步/生产者-消费者。重复打印数字 1-10 然后 10-1

java - 是否可以在内核端比较两个 DFEVar 值

Java正则表达式匹配无回车符后跟换行符

java - @FXML 注释和 FXMLLoader 类未解析为 Java 11 和 JavaFX 11 中的类型

c - 线程为 "slow"作为非线程