使用synhronize for getters / setter或AtomicReference

时间:2012-11-08 19:43:45

标签: java concurrency atomic java.util.concurrent

据我了解的情况如下:

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

我是对的吗?

2 个答案:

答案 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使整个块成为原子,这使您能够以原子方式进行更复杂的操作。

换句话说,volatileAtomicReferencesynchronized都有其特殊性,并不等同。

答案 1 :(得分:1)

挥发应该足够了。 AtomicReference添加了更多有用的操作,例如getAndSet()和compareAndSet()。但是,如果你只做和设置,那么volatile应该更便宜。