Java 在决定使用volatile时,实际锁是否重要?
假设我有以下代码:Java 在决定使用volatile时,实际锁是否重要?,java,multithreading,thread-safety,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
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;
}
我知道这两种操作都是原子操作,但我的问题是,
number
的值是否保证在不使用volatile的情况下推出到全局内存并对所有线程可见
number的值是否保证被推出到全局内存,并且在不使用volatile的情况下对所有线程可见
对。同步还提供了可见性。实际上,同步提供了可见性和原子性,而volatile只提供可见性 您尚未同步get,因此您的代码不是线程安全的:
public int get(){
return Integer.valueOf(number);
}
除此之外,同步将保证可视性,正如Eugene已经指出的。在数字上同步可能不是一个好主意,整数对象(可以)被缓存,因此这将阻止在同一数字上同步其他代码。@Jim true,我只是想举一个简单的例子:)+1:
同步的
可以使不稳定的
变得多余,但不是相反。@Eugene:erf,我今天过得很慢,但是。。。请稍等:我在get方法中没有看到任何synchronized。OP需要同步get和add,否则它将无法工作。AFAICT(但对我来说这是一个缓慢的一天)在OP的例子中既没有可见性也没有原子性,get根本没有使用同步机制。。。
public int get(){
return Integer.valueOf(number);
}