同步

2011-02-25 54 views
2

說我有一個同步方法的類。它實際上是一個使用Apache POI編寫excel文件的類。同步

public static synchronized List<CellData> createRow(final CellData... columns) { 
     List<CellData> row = new ArrayList<CellData>(); 

     if (columns != null && columns.length > 0) { 
      for (CellData column : columns) { 
       row.add(column); 
      } 
     } 
     return row; 
    } 

public synchronized void writeFile() throws IOException { 
     ................. 
} 

這個輔助類駐留在一個罐子裏(公共庫)和許多程序使用它在同一時間。

我是否真的需要使這個類同步,因爲每個使用它的類都創建該輔助類的實例?

回答

1

如果您有多個線程同時訪問您的類的同一個實例的可能性,您只需要同步共享數據的訪問權限。

所以問題是:

  1. 做你的方法實際上是共享訪問任何實例變量?

  2. 您是否曾經有多個線程同時訪問您的類的一個實例?

    在你描述的情況似乎並不是任何使用該庫的人都想做的事情。你可以簡單地記錄下這個實現是不同步的。

4

synchronized關鍵字僅在同一對象實例上調用方法的線程之間進行同步。

在您描述的情況下,由於每個其他類都創建了自己的實例,因此synchronized完全沒有用處,因此您可以安全地將其刪除。

1

我沒有看到之前有this.的任何變量,所以我無法檢測到在您的代碼中共享的任何成員變量。它看起來像你的createRow()只使用傳入的參數和本地成員變量。如果這是真的,我會得出結論,你不需要同步。

+0

在Java中,使用它訪問類的成員不是強制性的。所以這是一個很好的指標,但是隻有考慮到這個標準,你才能做出決定。 – krtek

+0

我明白這一點。我發表了評論,因爲其他的課程都沒有發佈,所以沒有它,我就不能說出任何方式。我認爲,如果你僅僅基於這句話,downvote是不公平的。 – duffymo

0

在更改可以從多個線程訪問的數據的情況下,您應該同步您的方法。

您的方法(在後)使用作爲參數傳遞的數據進行操作,因此您不必使用同步。

但是,如果您的靜態方法將使用公共靜態數據操作(alter),它將需要使用方法的同步。

1

如果方法不使用任何成員的類的 領域(即它僅使用 局部變量),那麼你不需要任何 同步

0

幾件事情請注意這裏

  • 類不同步。
  • 方法或方法塊是同步的。當我們說同步它意味着只有一個線程將執行該方法或同步塊中的代碼。
  • 只有當共享資源被多個線程讀取和修改時才需要同步。
  • 如果在一個方法中所有的變量都是本地的,那麼你不需要同步。如果有一個不是本地的變量或具有其他引用的參數,並且它們可以被多個線程讀取/修改,那麼您應該考慮同步該方法。