gpt4 book ai didi

Java并发-创建后更改可变对象

转载 作者:行者123 更新时间:2023-11-30 01:48:10 25 4
gpt4 key购买 nike

我在线程 A 中创建了一个 Employee 对象。Employee 类是可变的。在同一线程 A 中,我更新了员工工资并更改了其他字段。然后我将该对象放入映射中,并且不再从线程 A 访问 Employee 对象。

Employee empl = new Employee("Jhon", 12000);
empl.setSalary(9000);
Map<String, Employee> employees = new ConcurrentHashMap<>();

还有另一个线程B,它不断地无限循环地迭代 map 值并读取员工工资和其他字段。

线程 B 是否有可能看到构造对象时使用的工资 (12000),而不是更新后的工资? (9000)

请注意,我不会同时从不同线程更新同一对象。

最佳答案

Is there any chances that Thread B will see the salary used when the object has been constructed (12000), not the updated one? (9000)

给定:

  1. Employee employee = new Employee("John", 12000)在线程A中
  2. employee.setSalary(9000)在线程A中
  3. employees.put("someKey", employee)在线程A中
  4. employees 检索员工线程 B
  5. 中的 map ( map 是 ConcurrentMap )
  6. employee.getSalary()在线程 B

线程 B 保证只看到更新后的值 (9000)

<小时/>

来自 ConcurrentMap 's javadoc :

Memory consistency effects: As with other concurrent collections, actions in a thread prior to placing an object into a ConcurrentMap as a key or value happen-before actions subsequent to the access or removal of that object from the ConcurrentMap in another thread.

put 之间存在发生在关系婷安Employee进入ConcurrentMap及其后续检索 threadB .

这意味着setSalary之间也存在发生之前关系线程 A 和 getSalary 执行的操作通过线程 B。

因此线程 B 将看到 9000

关于Java并发-创建后更改可变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57136287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com