Collections.unmodifiableList(list)是否需要锁定?

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.

shm*_*sel 5

它不需要同步,因为不可修改的列表包装同步的列表.但是,在不可修改的列表上进行同步并没有多大用处,除了迭代的目的,这需要手动同步,无论如何:

当迭代它时,用户必须手动同步返回的列表:

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

不遵循此建议可能会导致非确定性行为.

编辑:正如Ferrybig指出的那样,实际上不可能与不可修改的包装器安全地同步.您可能需要考虑另一种线程安全解决方案,例如CopyOnWriteArrayList.