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は、必要に応じて揮発性よりも適切な選択となるいくつかの単純なアトミック操作を提供します。またsynchronized、ブロック全体をアトミックにします。これにより、より複雑な操作をアトミックな方法で行うことができます。

つまり、volatile、 、AtomicReferenceおよびsynchronizedすべてに固有性があり、同等ではありません。

于 2012-11-08T19:47:39.987 に答える
1

揮発性で十分です。AtomicReference には、getAndSet() や compareAndSet() などの便利な操作が追加されています。しかし、get と set だけを実行している場合は、volatile の方が安くなります。

于 2012-11-08T21:08:06.300 に答える