java - Collections.unmodificList 上的同步

标签 java multithreading synchronization thread-safety

我有一个问题。我想我知道答案,但出于某种原因我更喜欢在这里询问。

所以这是场景:

我有一个对象,其中有一个列表作为字段。然后我有一个方法将列表作为不可修改的列表返回。

Oject 类还有其他向列表添加元素的方法。

因此,让我们想象一种情况,其中一个线程正在迭代不可修改的列表,而另一个线程正在使用 Object 类方法向列表添加元素。

如何确保该线程安全?如果我同步不可修改列表和列表本身,它会使其线程安全吗?毕竟它们是两个不同的对象,其中不可修改的列表有一个字段,该字段是裸列表本身。

最佳答案

您需要同步“裸”列表:

private List<Foo> list = Collections.synchronizedList(new ArrayList<Foo>());

但要注意:这只能确保列表内部状态是一致的。一旦对列表进行迭代,就无法阻止在两次调用列表迭代器之间发生对列表的修改。因此,在这种情况下没有什么可以阻止 ConcurrentModificationException 的发生。为了防止这种情况发生,您不应返回对该列表的任何引用(即使是间接引用)。对列表的所有修改和迭代都应该封装在您的类中,并正确同步。

关于java - Collections.unmodificList 上的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31248821/

相关文章:

java - 带屏障的进程间同步

c++ - 从线程内 fork 是否安全?

node.js - 如何在 koa 中发送 HTTP 响应之前等待 url 回调?

java - HashMap 通过 2 种不同的方法进行操作 - 多线程和并发

java - JaxB 自动从 XML 解析为 Java 类

java - Java中HashMap解析并访问以下JSON数据格式

java - 通用对象池阈值

php - 如何让我的 WebApp 可以离线使用?

java - 尝试从类中导入嵌套类型

java - 使用反射调用方法