2011-05-24 69 views
7

我有關於同步列表的一般問題。
比方說,在構造函數中,我createing列表java - 一般synchronizedList問題

List synchronizedList = Collections.synchronizedList(list); 

,我有一個方法將對象添加到列表中。

public void add(String s){ 
    synchronizedList.add(s) 
} 

還有另一個線程每隔幾秒檢查一次是否有幾行,將其轉儲到文件並將其全部刪除。

現在讓我說我迭代每一行並將其保存到數據庫。在所有迭代之後,我清除列表中的 。

多線程支持如何幫助我?
我可以在其他線程中的clear()之前添加一個元素到列表中。
除非我自己管理鎖(我不真的需要一個同步列表)。

+0

由於所有三個答案都表示,同步列表意味着該列表上的所有操作都保證是原子的或保證對各個方法調用的串行訪問。我不得不問我的同事這是什麼意思。所以它意味着List上的操作像(從上面的代碼片段)'synchronizedList.size()'和'synchronizedList.add(s)'不能並行。對於正在閱讀此主題的某些人而言,這並不明顯。所以雖然增加了幫助其他誰不明白。謝謝@ WhiteFang34,@ jb-nizet和@khachik的解釋如下。 – 2014-12-17 18:34:03

回答

13

Collections返回的同步列表不會幫助您的情況。如果您需要保證對單個方法調用的串行訪問,這樣做是非常好的。如果您需要同時執行一組較大的操作,則需要手動將該代碼包裝在​​區塊中。 Javadoc指出:

用戶在迭代它時手動同步返回的列表是非常重要的。

如果您的列表在其他地方使用,至少可以保護它不受線程安全的個別方法調用。但是,如果您完全管理列表,則只需將​​塊添加到add方法中,並使用您在迭代時使用的同一個鎖。

13

synchronizedList確實只保證列表中的每個方法調用都是同步的。如果您需要以同步方式完成多個操作,則必須自己處理同步。

順便說一句,這在javadoc for Collections.synchronizedList被明確地說:

當務之急是用戶 手動返回 列表上迭代時同步:

List list = Collections.synchronizedList(new ArrayList()); 
     ... 
    synchronized(list) { 
     Iterator i = list.iterator(); // Must be in synchronized block 
     while (i.hasNext()) 
      foo(i.next()); 
    } 
4

同步列表意味着該列表上的所有操作都保證是原子的。你描述的場景需要在列表之外鎖定一些。考慮信號量或使​​塊來實現監視器。看看java.util.concurrent