【问题标题】:using synhronize for getters/setters or AtomicReference对 getter/setter 或 AtomicReference 使用 synhronize
【发布时间】:2012-11-08 19:43:44
【问题描述】:

据我了解,情况如下:

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

我说的对吗?

【问题讨论】:

    标签: java concurrency atomic java.util.concurrent


    【解决方案1】:

    在这两种情况下,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 各有特点,并不等同。

    【讨论】:

    • 那么 volatile 比 atomic 更高效?
    • @barn.gumbl AtomicReference 在内部使用 volatile 变量,但添加了一层 getter/setter,因此效率再高不过了——它们在大多数情况下可能大致相同。但是 volatile 对于您的示例当然更易于使用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 2023-03-07
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多