只读对象和多线程
Readonly objects and multithreading
在使用这个很棒页面的问题和答案 2 年多之后,我决定加入社区!
现在回答我的问题:
前几天我和一个朋友讨论过:我们认为,只读或只被线程读取的变量不需要锁或任何其他东西来确保读取正确的值。但是其他对象如 arraylists、hashmaps 呢?我是否确定多个线程可以一次毫无问题地使用任何对象的值?
不要对我太苛刻,如果我问错了方式或者在我的思维过程中遗漏了一些明显的东西(还在考虑原子性......)。我很感激任何答案:)
如果 Map
/ List
的构造是线程安全的,并且如果 ArrayList
或 HashMap
在构造后没有改变,那么是的,你的线程将能够正确读取数据。如果添加新数据或修改现有数据,则在没有适当同步的情况下,无法保证新更改对其他线程可见。
您的自定义共享 data/object 需要 immutable/writable-once/read-only-after-construction 类型。
或
您需要同步您的 collection 类型。
您可以使用与 JSR 166 一起发布的 java.util.concurrent 包中的 collection 类型,或者使用 java.util.Collections.synchronizedCollection(Collection obj) 函数同步您的 collection。
请记住,与多线程操作的同步Collection 相比,并发collection 要快得多,而且经过优化。
在使用这个很棒页面的问题和答案 2 年多之后,我决定加入社区!
现在回答我的问题:
前几天我和一个朋友讨论过:我们认为,只读或只被线程读取的变量不需要锁或任何其他东西来确保读取正确的值。但是其他对象如 arraylists、hashmaps 呢?我是否确定多个线程可以一次毫无问题地使用任何对象的值?
不要对我太苛刻,如果我问错了方式或者在我的思维过程中遗漏了一些明显的东西(还在考虑原子性......)。我很感激任何答案:)
如果 Map
/ List
的构造是线程安全的,并且如果 ArrayList
或 HashMap
在构造后没有改变,那么是的,你的线程将能够正确读取数据。如果添加新数据或修改现有数据,则在没有适当同步的情况下,无法保证新更改对其他线程可见。
您的自定义共享 data/object 需要 immutable/writable-once/read-only-after-construction 类型。
或
您需要同步您的 collection 类型。 您可以使用与 JSR 166 一起发布的 java.util.concurrent 包中的 collection 类型,或者使用 java.util.Collections.synchronizedCollection(Collection obj) 函数同步您的 collection。
请记住,与多线程操作的同步Collection 相比,并发collection 要快得多,而且经过优化。