2012-11-08 39 views
2

據我瞭解像這樣:使用getter/setter方法synhronize或的AtomicReference

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

在這兩種情況下,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,AtomicReference和​​都有其特殊性,並不等同。

+0

如此易失性比原子更有效率? – pvllnspk

+0

@ barn.gumbl AtomicReference在內部使用一個volatile變量,但增加了一層getters/setters,所以它不能更有效率 - 它們在大多數情況下可能大致相當。但揮發性確實更容易用於你的例子。 – assylias

+0

assylias,非常感謝您的解釋 – pvllnspk

1

揮發份應該足夠。 AtomicReference增加了更多有用的操作,比如getAndSet()和compareAndSet()。但是如果你只做得到和設定,揮發性應該更便宜。

相關問題