决定使用volatile时,实际锁定是否重要?

Sha*_*awn 7 java multithreading thread-safety

说我有以下代码:

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

public int get(){
    synchronized(number or numberLock){
        return Integer.valueOf(number);
     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在以下情况下,该add方法的以下版本需要具有number易失性:

public void add(int num){
    synchronized(number)
        number = number + num;
}
Run Code Online (Sandbox Code Playgroud)
public void add(int num){
    synchronized(numberLock)
        number = number + num;
}
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*ene 10

是否值为guarennteed被推送到全局内存并且在不使用volatile的情况下对所有线程可见?

是.同步也提供可视性.实际上,同步提供了可见性和原子性,而易失性仅提供可见性.

  • +1:`synchronized`可以使`volatile'多余,但不是相反. (3认同)