gpt4 book ai didi

java - 将 ArrayList 转换为 Collections.synchronizedList

转载 作者:行者123 更新时间:2023-11-30 02:18:26 26 4
gpt4 key购买 nike

我知道ArrayList不是线程安全的,我见过很多人推荐在 (Collections.synchronizedList) 中转换它。我需要创建一个系统,将 ArrayList 转换为 (Collections.synchronizedList),然后再转换回 ArrayList。但首先我需要在 b 中插入 a

问题是我不知道如何从 (Collections.synchronizedList) 转换为 ArrayList,当我尝试插入以下元素时出现错误:

public List<Object> a;
public List<ArrayList<Object>> b;

a = Collections.synchronizedList(new ArrayList<Object>());
b = Collections.synchronizedList(b);

当我尝试以下命令时,会引发异常:

b.add(id, (ArrayList<Object>) a);

java.base/java.util.Collections$SynchronizedRandomAccessList cannot be cast to java.base/java.util.ArrayList

最佳答案

a) 小心,Collections.synchronizedList() 不会使您的列表完全线程安全,它只是同步您的操作。如果您有多个线程读取和写入列表,并且您不知道自己在做什么,则仍然可能会遇到 ConcurrentModificationException。如果你想要更好的线程安全性,请使用 CopyOnWriteArrayList 。例如,如果一个线程将项目添加到 List,而另一个线程进行迭代,则这将破坏除 CopyOnWriteArrayList 之外的任何 List 实现,无论它是否包装在 Collections.synchronizedList() 中。

b) Collections.synchronizedList() 是 decorator围绕你的原始 list 。 IE。你的 ArrayList 仍然存在,在装饰器内部。您不需要将其复制回来,只需保留对原始 ArrayList 变量的引用即可。对同步列表所做的每个更改都会传播到 ArrayList。另一方面:为什么需要 ArrayList?一个好的 api 会接受任何 List 类型。依赖 ArrayList 作为实现类型至少违反了一个 Effective Java规则(第 52 项:通过接口(interface)引用对象)。因此,除非您针对明确需要 ArrayList 的 API 进行编码,否则只需使用同步列表(将字段类型更改为 List<List<Object>> )。

关于java - 将 ArrayList 转换为 Collections.synchronizedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582552/

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