2

据我了解,情况如下:

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

我对吗?

4

2 回答 2

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提供了一些简单的原子操作,如果您需要它们,这将使其成为 volatile 的不错选择。并使整个块原子化,这synchronized使您能够以原子方式进行更复杂的操作。

换句话说,volatileAtomicReference都有synchronized其特殊性,并不等价。

于 2012-11-08T19:47:39.987 回答
1

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

于 2012-11-08T21:08:06.300 回答