java - 在决定使用 volatile 时,实际的锁是否重要?

标签 java multithreading thread-safety

假设我有以下代码:

private Integer number;
private final Object numberLock = new Object();

public int get(){
    synchronized(number or numberLock){
        return Integer.valueOf(number);
     }
}

我的问题是,在以下情况下,add 方法的以下版本是否需要将 number 设为 volatile:

public void add(int num){
    synchronized(number)
        number = number + num;
}

public void add(int num){
    synchronized(numberLock)
        number = number + num;
}

我知道这些都是原子操作,但我的问题是,number guarennteed 的值是否被推送到全局内存并且对所有线程可见,而无需使用 volatile ?

最佳答案

is the value of number guarennteed to be pushed out to global memory and visible to all threads without using volatile?

是的。同步也提供可见性。实际上,同步提供可见性和原子性,而 volatile 仅提供可见性。

关于java - 在决定使用 volatile 时,实际的锁是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162622/

相关文章:

java二进制文件操作

java - Java 游戏中链表的迭代器

java - 实现非阻塞线程安全列表

multithreading - Delphi 中增加和返回整数的线程安全方法

objective-c - 通过 Web 服务将持久项目上传到磁盘

java - 如何从所有节点的 Eclipse JDT Parser 解析的 java 源中获取行和/或列?

java - 在 Java 中执行 Linux nodejs 命令行

java - 从调用线程运行 CompletableFuture.thenAccept ?

C:如何让线程相互通信?

java - 如何使我的 MouseListeners 在反序列化的 JPanel 中工作?