说我有以下代码:
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的情况下对所有线程可见?
答案 0 :(得分:10)
是数字值被推送到全局内存并且在不使用volatile的情况下对所有线程可见的值?
是。同步也提供可视性。实际上,同步提供了可见性和原子性,而易失性仅提供可见性。
答案 1 :(得分:1)
您尚未同步获取,因此您的代码不是线程安全的:
public int get(){
return Integer.valueOf(number);
}
除此之外,同步将保证Eugene已经注意到的可见性。