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);
}