the*_*ger 11 java collections multithreading arraylist
我有一个productList
名为的文件维护Products.java
private List<String> productList = Collections.synchronizedList(new ArrayList());
Run Code Online (Sandbox Code Playgroud)
现在创建一个同步列表,将确保添加/删除等操作将具有隐式锁定,并且我不需要显式锁定这些操作.
我有一个函数暴露,它返回unmodifiableList
此列表的一个.
public List getProductList(){
return Collections.unmodifiableList(productList);
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,各种线程可以同时调用此函数.因此,synchronized
在将List转换为不可修改的List时,我需要放置一个块,或者由于我使用的是sychronizedList,这是否已经处理好了?
TIA.
它不需要同步,因为不可修改的列表包装同步的列表.但是,在不可修改的列表上进行同步并没有多大用处,除了迭代的目的,这需要手动同步,无论如何:
当迭代它时,用户必须手动同步返回的列表:
Run Code Online (Sandbox Code Playgroud)List list = Collections.synchronizedList(new ArrayList()); ... synchronized (list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }
不遵循此建议可能会导致非确定性行为.
编辑:正如Ferrybig指出的那样,实际上不可能与不可修改的包装器安全地同步.您可能需要考虑另一种线程安全解决方案,例如CopyOnWriteArrayList
.
归档时间: |
|
查看次数: |
475 次 |
最近记录: |