gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:47 25 4
gpt4 key购买 nike

我在名为 Products.java 的文件中维护了一个 productList

private List<String> productList = Collections.synchronizedList(new ArrayList());

现在创建一个同步列表,将确保像添加/删除这样的操作将有一个隐式锁,我不需要显式地锁定这些操作。

我公开了一个返回此列表的 unmodifiableList 的函数。

public List getProductList(){

return Collections.unmodifiableList(productList);
}

在我的应用程序中,多个线程可以同时调用这个函数。那么,在将 List 转换为不可修改的 List 时,我是否需要放置一个 synchronized block ,或者因为我使用的是 sychronizedList ,所以这已经被处理了吗?

TIA。

最佳答案

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

It is imperative that the user manually synchronize on the returned list when iterating over it:

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

Failure to follow this advice may result in non-deterministic behavior.

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

关于java - Collections.unmodifiableList(list) 是否需要锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35287565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com