2016-06-09 64 views
1

說我有下面的類如何將普通的舊Java類變爲原子類?

public class Hello { 
    private int first = 0; 
    private String result = ""; 
    private Queue<Integer> queue1 = new Queue<>(); 
    private Queue<Integer> queue2 = new ConcurrentLinkedQueue<>(); 

    public int getFirst() { 
     return first; 
    } 

    public void setFirst(int first) { 
     this.first = first; 
    } 

    public String getResult() { 
     return result; 
    } 

    public void setResult(String result) { 
     this.first = first; 
    } 

    public void addQueue1(int number) { 
     queue1.add(number); 
    } 

    public void addQueue12(int number) { 
     queue2.add(number); 
    } 

} 

現在假設多個線程要修改這個類的一個實例。有沒有辦法讓我可以把這個整個類Atomic而不是使用synchornized關鍵字?換句話說多線程可以調用任何getter或setter,但實例需要被原子地修改?我怎樣才能使用AtomicReference並將其更改爲線程安全類?

+1

看看Java原子包(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html) - AtomicReference可能會做你所想想要,但我不確定他們是否能夠滿足您在原子更新方面的需求(與原子訪問相對) – romeara

+0

是否有任何不變量會影響您的屬性?必須同時改變並保持其關係的相關屬性。 –

+0

@doge我會認爲是的。 – user1870400

回答

1

一個類不能是原子的;只有動作可以是原子的。

沒有辦法說「這個班上的所有動作都必須是原子的」,因爲這太不明瞭。你需要一種方式來說「這些一組原子的獲取和集合,但是這些另一些原子組成另一個原子。」通過​​塊—來定義這個方法,這正是他們在那裏。

相關問題