2

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

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

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

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

4

2 回答 2

3

推送到并发集合被定义为发布它。请参阅包描述中的“内存一致性属性”。

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

于 2015-01-15T23:03:16.780 回答
2

答:如果对象是不可变的,或者如果对象是可变的,但所有属性都在对象添加到集合之前设置,那么是的,它们都是可见的。B:如果没有同步机制,则不能保证,这取决于线程 2 何时访问对象。

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

于 2015-01-15T22:50:30.863 回答