是否有某個util創建一個在指定互斥鎖上同步的列表?像java.util.Collections.synchronizedList(List<T> list, Object mutex)
但公開?Util創建在指定互斥鎖上同步的列表
1
A
回答
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
視圖地圖:
當務之急是用戶遍歷其任何收集意見時返回的地圖上手動同步:
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操作都需要多次訪問集合,因此需要手動或更高級別的同步,從而使低級同步過時。
很容易想到將同步集合傳遞給使用集合的任意方法,並自動獲取線程安全性,而無需額外的同步,但是因爲只有當所述方法由對集合的單一訪問組成時,找到有用的真實生活方式。
所以底線是你將永遠不得不使你的代碼線程安全並控制對集合的訪問,因此永遠不會有真正的需要同步收集。
相關問題
- 1. 鎖定和同步使用互斥
- 2. 在Linux上如何創建互斥鎖?
- 3. 使用互斥鎖的pthread同步
- 4. Posix線程與互斥鎖的同步
- 5. 獲取互斥鎖列表?
- 6. 創建在C互斥鎖櫃類++
- 7. 在PHP上創建互斥陣列
- 8. 鎖定多個互斥鎖
- 9. 同步和互斥
- 10. 如何創建互斥的表列
- 11. 從鎖定的同步恢復。互斥體
- 12. 無法創建互斥鎖。 ASP.NET
- 13. 創建一個互斥列
- 14. 如何鎖定初始化程序列表中的互斥鎖?
- 15. 線程在同一互斥鎖的多個鎖上的行爲
- 16. 互斥鎖和鎖
- 17. 多個互斥體上的Windows同步
- 18. 指定互斥鎖的不同HANDLE結果
- 19. 在C++ 98互斥鎖中鎖定變量共享數據互斥鎖
- 20. 原子創建一個文件鎖定在MATLAB(文件互斥)
- 21. Ocaml獲取互斥鎖列表
- 22. 鎖定互斥鎖的分段錯誤
- 23. 成功的互斥鎖鎖定
- 24. android NDK互斥鎖定
- 25. 提升互斥鎖定在同一線程上
- 26. 線程同步,互斥
- 27. 不鎖定pthread_cond_timedwait和pthread_cond_signal的互斥鎖(在Linux上)
- 28. 在C/C++在Linux上,我該如何創建一個互斥預先鎖定
- 29. C# - 鎖定互斥鎖問題
- 30. 函數可以鎖定互斥鎖嗎?
爲什麼你認爲你需要那個? – Holger 2015-05-05 11:03:32
需要實現一些複雜的操作(除了插入和刪除),並且它們也必須針對其他列表修改操作。 – 2015-05-05 19:41:45