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

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=新

我在线程A中创建了一个
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中
  • 从线程B中的
    employees
    映射(映射是
    ConcurrentMap
    )中检索员工
  • employee.getSalary()
    在线程B
  • 螺纹B保证只看到更新值(9000)


    发件人:

    内存一致性影响:与其他并发集合一样,在将对象作为键或值放入ConcurrentMap之前,线程中的操作发生在另一个线程中从ConcurrentMap访问或删除该对象之后的操作之前

    员工
    放入
    ConcurrentMap
    和随后通过
    threadB
    检索之间存在一个before关系

    这意味着线程A的
    setSalary
    操作和线程B的
    getSalary
    之间也存在before关系


    因此,线程B将看到您正在使用的
    9000

    ,只要您在放置对象后不修改/读取线程A中的对象,就可以了。你也可以看看这个问题。当你把这个对象放在共享地图上时(我假设你用某种方法创建了这个对象,所以它是一个局限于这个线程的本地对象),你会发布它的状态,只要你放在地图上后不修改/读取它,就不用担心了。如果您想在将其放在那里之后对其进行修改,那么您将遇到问题,并且在访问此对象时必须在某个公共锁上进行同步。