据我了解情况如下:

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

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

关于java - 使用synhronize进行getter/setter或AtomicReference,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13296553/

10-09 01:14