2016-10-03 58 views
-1

现在使用这个伟大的页面的问题和答案已超过2年了,我决定加入社区!只读对象和多线程

现在我的问题:

我有一个朋友的讨论,一天:我们认为,这其中的变量是只读或只由线程读取不需要锁或其他任何东西,以保证读取正确的值。但是像arraylist,hashmaps这样的其他对象又有什么用?我是否确切地知道,多个线程可以毫无问题地立即使用任何对象的值?

不要对我太苛刻,如果我问了错误的方式或错过了我的思维过程中显而易见的东西(仍然在考虑原子性......)。我现在没有任何答案:)

+0

这样的变量应该声明为final,然后是线程安全的。 – olsli

回答

0

如果Map/List的建设是线程安全的感激,如果该ArrayListHashMap没有改变后建设,那么,你的线程将能够读取数据正确。如果添加新数据或者修改了现有数据,那么如果没有正确的同步,则不能保证新的更改对其他线程可见。

0

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

OR

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

请记住,与多线程操作的synchronizedCollection相比,并发收集速度更快且优化得多。