Java 并发集合和可见性

Java Concurrent Collections and visiblity

关于集合中数据的可见性,我对并发集合(例如 ConcurrentMap)的期望有点不确定。

A:Thread1 放入一个复杂的对象,Thread2 得到它。所有属性在 Thread2 中是否可见?

B: Thread1 放置了一个复杂的对象,后来改变了一些属性。然后Thread2得到它,所有的变化在Thread2中是否可见?

我猜 B 是假的,如果是这样我应该同步对复杂对象的每次访问?

A:如果对象是不可变的或者如果对象是可变的但所有属性都已设置对象被添加到集合中那么是的,它们都是可见的. B:如果没有同步机制就无法保证,这取决于线程 2 何时访问对象。

如果您需要保证这种行为(即保证读取线程以类似事务的方式看到增变线程所做的所有修改),我建议您设置一个信号机制。更好的是,如果你使用不可变对象会更简单。

推送到并发集合定义为发布它。请参阅包说明中的“Memory Consistency Properties”。

这意味着如果您只是更改存储的对象,您不会自动获得先发生关系。您需要进行这些更改 synchronied/volatile 或使用并发原语本身。