提问者:小点点

如果对象在java的并发映射之外被修改会发生什么?


如果对象在java的并发映射之外被修改会发生什么?

比方说,我有一个并发哈希映射,在一个线程中,我从该映射中检索一个值并修改其状态。其他线程会在没有额外同步的情况下看到修改吗?


共2个答案

匿名用户

Java内存模型中的关键概念是发生在关系之前。只有当线程之间存在发生在关系之前时,您才能依赖线程之间发生的事情。

ConCurrentHashMap的情况下,对于同一键,put和后续获取值之间存在发生前关系:更新值并将其放入映射发生在获取值并读取其状态之前。由于这种关系发生在关系之前,因此更新发生在读取状态之前,因此您将看到更新后的状态。

因此,如果您更新对象的状态,然后将其放入映射中,如果您随后从映射中获取它,您肯定会看到更新后的状态(直到您再次放入时)。

但是,如果您在ConCurrentHashMap的上下文之外有对该对象的引用,则没有自动发生在关系之前。您必须为自己创建该关系。

做到这一点的一种方法是同步(如在所有线程中的同一对象上使用同步);其他方法包括:

  • 写入和读取易失性变量
  • 使用
  • 再次将对象放入映射中,然后在开始在另一个线程中使用它之前从映射中获取。

匿名用户

简短的回答是否定的。

并发映射只会同步对映射的访问。也就是说,如果一个线程写入映射,所有其他线程都可以看到,而无需额外的同步。

如果您从映射中检索一个对象并在没有同步的情况下对其进行修改,并且如果另一个线程检索相同的对象来读取它,那么您就会在这些线程之间没有显式同步的情况下发生竞争。