当我的 J2EE web 应用程序启动时,我会一次性填充一个集合。
然后,多个线程可以同时访问它,但只能读取它。
我知道使用同步集合对于并行写入是强制性的,但是我仍然需要它来进行并行读取吗?
通常不会,因为在这种情况下您不会更改集合的内部状态。当您迭代集合时,将创建迭代器的新实例,并且迭代的状态是每个迭代器实例。
旁注:请记住,通过保留只读集合,您只能防止对集合本身进行修改。每个集合元素仍然是可变的。
class Test {
public Test(final int a, final int b) {
this.a = a;
this.b = b;
}
public int a;
public int b;
}
public class Main {
public static void main(String[] args) throws Exception {
List<Test> values = new ArrayList<Test>(2);
values.add(new Test(1, 2));
values.add(new Test(3, 4));
List<Test> readOnly = Collections.unmodifiableList(values);
for (Test t : readOnly) {
t.a = 5;
}
for (Test t : values) {
System.out.println(t.a);
}
}
}
这输出:
5
5
@WMR 答案的重要考虑因素。
这取决于线程是否
阅读您的收藏已开始
在填充之前或之后。如果
他们在你填满之前就开始了,
你没有任何保证(没有
同步),这些线程
将永远看到更新的值。
造成这种情况的原因是Java内存
模型,如果你想了解更多,请阅读
此链接的“可见性”部分:http://gee.cs.oswego.edu/dl/cpj/jmm.html http://gee.cs.oswego.edu/dl/cpj/jmm.html
即使线程已启动
当你填满你的收藏后,你
可能必须同步,因为您的
收集实施可能会改变
即使在读取时其内部状态
操作(谢谢迈克尔
巴西奈 https://stackoverflow.com/questions/152342/in-java-do-i-need-to-declare-my-collection-synchronized-if-its-read-only#152425,
我不知道有这样的收藏
存在)。
另一个非常有趣的读物
并发主题涵盖
诸如对象发布之类的主题,
可见性等更详细
是布莱恩·戈茨的书爪哇
并发性
实践 http://www.briangoetz.com/pubs.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)