gpt4 book ai didi

java - 为什么我需要同步 Collections.synchronizedList 返回的列表

转载 作者:太空狗 更新时间:2023-10-29 22:39:47 27 4
gpt4 key购买 nike

我在 dos.oracle.com 上找到了这个

public static List synchronizedList(List list)

Returns a synchronized (thread-safe) list backed by the specified list. In order to guarantee serial access, it is critical that all access to the backing list is accomplished through the returned list. 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());
}

我的问题是:如果 Collections.synchronizedList(); 应该返回一个已经同步的列表,为什么我必须同步列表来迭代它?

我只是在两个线程中访问列表:一个线程只添加,另一个线程获取和删除。对于这种情况,您还推荐使用哪些其他类?

感谢阅读。

最佳答案

被同步的列表仅意味着addremove 等操作是同步的,因此是原子的。然而,迭代不是,如果一个线程 adds 而另一个线程正在迭代,您可能会得到一个 ConcurrentModificationException。

通过手动同步迭代 block ,您可以确保列表在迭代时不被修改。

一种替代方法是使用 a CopyOnWriteArrayList它提供了an iterator在迭代开始时已知遍历列表,而不管后续的修改。但是,如果您需要经常更改列表的内容,则该集合效率不高。

关于java - 为什么我需要同步 Collections.synchronizedList 返回的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17994400/

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