只读对象和多线程

时间:2016-10-03 11:14:30

标签: java multithreading locking final readonly

在使用这个伟大页面的问题和答案超过2年后,我决定加入社区!

现在问我的问题:

我前几天与朋友讨论过:我们认为,只读或仅由线程读取的变量不需要锁定或其他任何东西来确保读取正确的值。但是像arraylists,hashmaps这样的其他对象是什么呢?我是否确实知道多个线程可以同时使用任何对象的值而没有问题?

如果我问错了方法或错过了我思想过程中显而易见的事情(仍在考虑原子性......),请不要对我过于苛刻。我很感激任何答案:)

2 个答案:

答案 0 :(得分:0)

如果Map / List的构造是线程安全的,并且如果构造后ArrayListHashMap没有改变,那么是的,你的线程将会能够正确读取数据。如果添加了新数据或修改了现有数据,则在没有正确同步的情况下,无法保证其他线程可以看到新的更改。

答案 1 :(得分:0)

您的自定义共享数据/对象需要不可变/可写 - 一次/只读后构造类型。

OR

您需要同步您的收藏类型。 您可以使用JSR 166发布的java.util.concurrent包中的集合类型,也可以使用java.util.Collections.synchronizedCollection(Collection obj)函数同步集合。

请记住,与用于多线程操作的synchronizedCollection相比,并发收集更快更优化。