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

时间:2012-02-06 15:37:53

标签: 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为易变符号:

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

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

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

2 个答案:

答案 0 :(得分:10)

  

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

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

答案 1 :(得分:1)

您尚未同步获取,因此您的代码不是线程安全的:

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

除此之外,同步将保证Eugene已经注意到的可见性。