据我了解的情况如下:
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);
}
}
我是对的吗?
答案 0 :(得分:4)
在这两种情况下,getter和setter中的操作都是原子的(引用赋值)。因此,更有效(至少在可读性方面)的习惯用语是:
class Case3 {
private volatile Object object = new Object();
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
至于你的实际问题,AtomicReference
提供了一些简单的原子操作,如果你需要它们会使它成为一个很好的选择。并且synchronized
使整个块成为原子,这使您能够以原子方式进行更复杂的操作。
换句话说,volatile
,AtomicReference
和synchronized
都有其特殊性,并不等同。
答案 1 :(得分:1)
挥发应该足够了。 AtomicReference添加了更多有用的操作,例如getAndSet()和compareAndSet()。但是,如果你只做和设置,那么volatile应该更便宜。