据我了解情况如下:
class Case1{
private Object object;
public synchronized Object getObject() {
return object;
}
public synchronized void setObject(Object object) {
this.object = object;
}
}
与以下内容相比,将被视为已弃用:
class Case2{
private AtomicReference<Object> object = new AtomicReference<Object>();
public Object getObject() {
return object.get();
}
public void setObject(Object object) {
this.object.set(object);
}
}
我对吗?
最佳答案
在这两种情况下,getter和setter内的操作都是原子操作(引用赋值)。因此,更有效的用法(至少就可读性而言)是:
class Case3 {
private volatile Object object = new Object();
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
对于您的实际问题,
AtomicReference
提供了一些简单的原子操作,如果需要它们,它将成为优于volatile的不错选择。并且synchronized
使整个块成为原子的,这使您能够以原子的方式进行更复杂的操作。换句话说,
volatile
,AtomicReference
和synchronized
都有其特殊性,并不等同。关于java - 使用synhronize进行getter/setter或AtomicReference,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13296553/