作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题。我想我知道答案,但出于某种原因我更喜欢在这里询问。
所以这是场景:
我有一个对象,其中有一个列表作为字段。然后我有一个方法将列表作为不可修改的列表返回。
Oject 类还有其他向列表添加元素的方法。
因此,让我们想象一种情况,其中一个线程正在迭代不可修改的列表,而另一个线程正在使用 Object 类方法向列表添加元素。
如何确保该线程安全?如果我同步不可修改列表和列表本身,它会使其线程安全吗?毕竟它们是两个不同的对象,其中不可修改的列表有一个字段,该字段是裸列表本身。
最佳答案
您需要同步“裸”列表:
private List<Foo> list = Collections.synchronizedList(new ArrayList<Foo>());
但要注意:这只能确保列表内部状态是一致的。一旦对列表进行迭代,就无法阻止在两次调用列表迭代器之间发生对列表的修改。因此,在这种情况下没有什么可以阻止 ConcurrentModificationException 的发生。为了防止这种情况发生,您不应返回对该列表的任何引用(即使是间接引用)。对列表的所有修改和迭代都应该封装在您的类中,并正确同步。
关于java - Collections.unmodificList 上的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31248821/
我有一个问题。我想我知道答案,但出于某种原因我更喜欢在这里询问。 所以这是场景: 我有一个对象,其中有一个列表作为字段。然后我有一个方法将列表作为不可修改的列表返回。 Oject 类还有其他向列表添加
我是一名优秀的程序员,十分优秀!