2009-12-14 117 views
16

考慮下面的代碼:同步的「參考」或實例

public class Foo { 
    private static final Object LOCK = new Object(); 
    private Object _lockRef1 = LOCK; 
    private Object _lockRef2 = LOCK; 
    private int _indx = 0; 

    public void dec() { 
    synchronized(_lockRef1) { 
     _indx--; 
    } 
    } 

    public void inc() { 
    synchronized(_lockRef2) { 
     _indx++; 
    } 
    } 
} 

是調用方法dec()inc()線程?一方面這些方法在兩個不同的實例上同步_ lockRef1和_ lockRef2。在另一方面,這種情況下「點」同一個對象LOCK上...

回答

16

他們不是「同步在兩個不同的實例」 - 只因爲你使用兩種不同的變量並不意味着有兩個不同的實例。您有幾個變量,每個變量都具有相同的值 - 對單個實例java.lang.Object的引用。

所以是的,這是線程安全的。當然,你不應該在可讀性方面編寫這樣的代碼,但假設你只是試圖理解發生了什麼,那很好。

+0

這個問題被標記爲'Java',所以我認爲這將是'java.lang.Object'。 – Yuval 2009-12-14 11:38:24

+0

@Yuval:Doh--沒有發現。謝謝,修正:) – 2009-12-14 11:46:10

+0

明白了!謝謝!實際上,我有一個emun而不是「私人靜態最終對象」,但看起來這個想法是一樣的。 – Lopotun 2009-12-14 12:14:49