我对于Concurrent Collections(例如ConcurrentMap)对集合中数据可见性的期望有点不确定。
答:Thread1放置一个复杂的对象,Thread2得到它。所有属性都会在Thread2中可见吗?
B:Thread1放置一个复杂的对象,后来改变了一些属性。然后Thread2获取它,所有更改都将在Thread2中可见吗?
我猜B是假的,如果是的话我应该同步复杂对象的每一次访问?
答案 0 :(得分:3)
推送到并发集合被定义为发布它。见" Memory Consistency Properties"在包装说明中。
这意味着如果您只是更改存储的对象,则不会在关系之前自动获得。您需要使这些更改同步/易失或使用并发原语本身。
答案 1 :(得分:2)
答:如果对象是不可变的,或者如果对象是可变的,但是之前将所有属性设置为,则将对象添加到集合中,然后是,它们将全部可见。 B:如果没有同步机制,则无法保证,它取决于线程2何时访问对象。
如果您需要保证这种行为(即保证读取线程能够以类似事务的方式查看mutator线程所做的所有修改),我建议您设置一个信号量机制。更好的是,如果你使用不可变对象会更简单。