如果对象在java的并发映射之外被修改会发生什么?
比方说,我有一个并发哈希映射,在一个线程中,我从该映射中检索一个值并修改其状态。其他线程会在没有额外同步的情况下看到修改吗?
Java内存模型中的关键概念是发生在关系之前。只有当线程之间存在发生在关系之前时,您才能依赖线程之间发生的事情。
在ConCurrentHashMap
的情况下,对于同一键,put和后续获取值之间存在发生前关系:更新值并将其放入映射发生在获取值并读取其状态之前。由于这种关系发生在关系之前,因此更新发生在读取状态之前,因此您将看到更新后的状态。
因此,如果您更新对象的状态,然后将其放入映射中,如果您随后从映射中获取它,您肯定会看到更新后的状态(直到您再次放入时)。
但是,如果您在ConCurrentHashMap
的上下文之外有对该对象的引用,则没有自动发生在关系之前。您必须为自己创建该关系。
做到这一点的一种方法是同步(如在所有线程中的同一对象上使用同步
);其他方法包括:
易失性
变量锁
简短的回答是否定的。
并发映射只会同步对映射的访问。也就是说,如果一个线程写入映射,所有其他线程都可以看到,而无需额外的同步。
如果您从映射中检索一个对象并在没有同步的情况下对其进行修改,并且如果另一个线程检索相同的对象来读取它,那么您就会在这些线程之间没有显式同步的情况下发生竞争。