[英]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)
鑒於:
Employee employee = new Employee("John", 12000)
線程A中的Employee employee = new Employee("John", 12000)
employee.setSalary(9000)
employees.put("someKey", employee)
employees
地圖(地圖是ConcurrentMap
)中檢索雇員 employee.getSalary()
線程B確保僅看到更新的值(9000)
內存一致性影響:與其他並發集合一樣,在將對象作為鍵或值放入ConcurrentMap中之前,線程中的操作發生在從另一個線程中的ConcurrentMap中訪問或刪除該對象之后的操作之前 。
在put
Employee
放入ConcurrentMap
和隨后由threadB
進行檢索之間存在先發生的關系。
這意味着線程A的setSalary
操作與線程B的getSalary
之間也存在事前關系。
因此線程B將看到9000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.