据我所知,这种情况如下:
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);
}
}我说的对吗?
发布于 2012-11-09 03:47:40
在这两种情况下,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都有自己的特殊性,并不是等价的。
发布于 2012-11-09 05:08:06
易失性应该足够了。AtomicReference添加了更多有用的操作,如getAndSet()和compareAndSet()。但是如果你只做get和set,易失性应该更便宜。
https://stackoverflow.com/questions/13296553
复制相似问题