2012-09-20 43 views
2

衆所周知的同步建議一個最終private對象上(相對於上同步this甚至protected數據成員)。如何由多個類調和私有對象上同步

但是當我的應用程序中有多個類(模塊)需要在一個公共對象上同步時會發生什麼?

有沒有辦法調和這兩個看似矛盾的要求?

爲了更好的解釋,如果我有Owner類的私有數據成員定義爲:

private final Object $01pfo = new Object[0]; 

然後在Owner任何方法可以簡單地使用它:

protected void anyMethod() { 
    synchronized ($01pfo) { 
      // do your thing 
    } 
    } 

但是,如果我想同步$01pfo從不同的類(說User),是我唯一的選擇使$01pfo保護或公共?

protected final Object $01pfo = new Object[0]; 

有沒有更好的方法?或解決方案?

回答

2

如果不在多個對象之間傳播,同步塊運行良好。

如果您需要使用多個類中的單個鎖同步操作,最好查看Lock實現。

它會給你更多的自由度粒度訪問資源在幾個線程

3

我認爲使用protected關鍵字的包隱私作爲黑客攻擊。在您的使用案例中,看起來這些類正在協作以同步的方式執行特定的任務。我將在啓動此任務的類/方法中定義一個Lock對象,並通過將其作爲構造函數參數傳遞給所有涉及的類,從而使對象可用。

0

您所提供的鏈接是清楚地瞭解考慮私人最終,而不是這個情況:

  • 我們正在談論的實例同步;
  • 如果您的鎖定需要粒度,而不是同步(this)提供,那麼synchronized(this)不適用,因此這不是問題。

當您需要另一個粒度時,請隨意使用另一個同步對象。順便說一句,在你的例子中,

private final Object $01pfo = new Object() 

就夠了。