2015-04-03 64 views
1

是否有某個util創建一個在指定互斥鎖上同步的列表?像java.util.Collections.synchronizedList(List<T> list, Object mutex)但公開?Util創建在指定互斥鎖上同步的列表

+0

爲什麼你認爲你需要那個? – Holger 2015-05-05 11:03:32

+0

需要實現一些複雜的操作(除了插入和刪除),並且它們也必須針對其他列表修改操作。 – 2015-05-05 19:41:45

回答

0

有沒有這樣的public方法,可以讓你控制同步收集將使用的互斥體。所以,如果它不是,它允許你指定互斥的列表,你更高級別的操作必須與靈活性來實現,例如:

public static <T> boolean addIfNew(List<T> target, T value, Object mutex) { 
    synchronized (mutex) { 
     return !target.contains(value) && target.add(value); 
    } 
} 

它可以被用來作爲

List<String> synchedList=Collections.synchronizedList(new ArrayList<String>()); 
addIfNew(synchedList, "foo", synchedList); 

該作品因爲synchronizedList返回的列表將使用它自己作爲互斥體。與its documentation比較:

重點煤礦

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

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

之所以實現允許在內部使用不同的互斥對象是您可以創建sub lists和子同步列表的列表將在支持列表實例上而不是自身上進行同步(同樣適用於Vector.subList)。因此,當您將子列表傳遞給您的高級方法時,將原始同步列表作爲互斥體傳遞至關重要。

類似的東西應用到Collection視圖地圖:

Collections.synchronizedMap

當務之急是用戶遍歷其任何收集意見時返回的地圖上手動同步:

Map m = Collections.synchronizedMap(new HashMap()); 
    ... 
Set s = m.keySet(); // Needn't be in synchronized block 
    ... 
synchronized (m) { // Synchronizing on m, not s! 
    Iterator i = s.iterator(); // Must be in synchronized block 
    while (i.hasNext()) 
     foo(i.next()); 
} 

這有一個簡化。如果確保所有對集合的訪問都發生在您的方法中,那麼這些方法可能會就任意互斥體達成一致,並且如果一致地同步該互斥體,則可能是線程安全的。當然,集合本身並不需要自己進行額外的同步,但這就是它的全部內容:

實際上,您很難找到這些同步集合的任何有用場景。任何非trival操作都需要多次訪問集合,因此需要手動或更高級別的同步,從而使低級同步過時。

很容易想到將同步集合傳遞給使用集合的任意方法,並自動獲取線程安全性,而無需額外的同步,但是因爲只有當所述方法由對集合的單一訪問組成時,找到有用的真實生活方式。

所以底線是你將永遠不得不使你的代碼線程安全並控制對集合的訪問,因此永遠不會有真正的需要同步收集。