Java并发-创建后更改可变对象
我在线程A中创建了一个Java并发-创建后更改可变对象,java,multithreading,Java,Multithreading,我在线程A中创建了一个Employee对象。Employee类是可变的。在同一个线程A中,我更新了员工工资并更改了其他字段。然后我将对象放入一个映射中,不再从线程a访问Employee对象 Employee empl = new Employee("Jhon", 12000); empl.setSalary(9000); Map<String, Employee> employees = new ConcurrentHashMap<>(); Employee emp=新
Employee
对象。Employee
类是可变的。在同一个线程A中,我更新了员工工资并更改了其他字段。然后我将对象放入一个映射中,不再从线程a访问Employee
对象
Employee empl = new Employee("Jhon", 12000);
empl.setSalary(9000);
Map<String, Employee> employees = new ConcurrentHashMap<>();
Employee emp=新员工(“Jhon”,12000);
雇员固定工资(9000);
Map employees=新的ConcurrentHashMap();
还有另一个线程B,它不断迭代无限循环中的映射值,读取员工工资和其他字段
线程B是否有可能看到在构建对象(12000)时使用的工资,而不是更新后的工资?(9000)
请注意,我不会同时从不同线程更新同一对象
线程B是否有可能看到在构建对象(12000)时使用的工资,而不是更新后的工资?(9000)
鉴于:
Employee=线程A中的新员工(“John”,12000)
employee.setSalary(9000)
在线程A中employees.put(“someKey”,employees)
在线程A中employees
映射(映射是ConcurrentMap
)中检索员工employee.getSalary()
在线程B发件人: 内存一致性影响:与其他并发集合一样,在将对象作为键或值放入ConcurrentMap之前,线程中的操作发生在另一个线程中从ConcurrentMap访问或删除该对象之后的操作之前 在
将员工
放入ConcurrentMap
和随后通过threadB
检索之间存在一个before关系
这意味着线程A的setSalary
操作和线程B的getSalary
之间也存在before关系
因此,线程B将看到您正在使用的9000
,只要您在放置对象后不修改/读取线程A中的对象,就可以了。你也可以看看这个问题。当你把这个对象放在共享地图上时(我假设你用某种方法创建了这个对象,所以它是一个局限于这个线程的本地对象),你会发布它的状态,只要你放在地图上后不修改/读取它,就不用担心了。如果您想在将其放在那里之后对其进行修改,那么您将遇到问题,并且在访问此对象时必须在某个公共锁上进行同步。