簡體   English   中英

Java並發-創建后更改可變對象

[英]Java concurrency - change mutable object after creation

我在線程A中創建了一個Employee對象。一個Employee類是可變的。 在同一線程A中,我更新了員工薪水並更改了其他字段。 然后,將對象放入映射中,不再從線程A訪問Employee對象。

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

還有另一個線程B,它不斷地在無限循環中遍歷地圖值並讀取Employee薪水和其他字段。

線程B是否有可能看到構造對象時使用的薪水(12000),而不是更新的薪水? (9000)

請注意,我不會同時從不同線程更新同一對象。

線程B是否有可能看到構造對象時使用的薪水(12000),而不是更新的薪水? (9000)

鑒於:

  1. Employee employee = new Employee("John", 12000)線程A中的Employee employee = new Employee("John", 12000)
  2. 線程A中的employee.setSalary(9000)
  3. 線程A中的employees.put("someKey", employee)
  4. 從線程B中employees地圖(地圖是ConcurrentMap )中檢索雇員
  5. 線程B中的 employee.getSalary()

線程B確保僅看到更新的值(9000)


ConcurrentMap的javadoc

內存一致性影響:與其他並發集合一樣,在將對象作為鍵或值放入ConcurrentMap中之前,線程中的操作發生在從另一個線程中的ConcurrentMap中訪問或刪除該對象之后的操作之前

put Employee放入ConcurrentMap和隨后由threadB進行檢索之間存在先發生的關系。

這意味着線程A的setSalary操作與線程B的getSalary之間也存在事前關系。

因此線程B將看到9000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM