Java 在操作多个属性并锁定一个锁对象时使用同步和易失性

问题描述 投票:0回答:1

我需要在 Java 中操作多个属性,同时保持它们同步。

这段代码正确吗(根据我的理解,这是):

class X {
    private final Object lockObject = new Object();
    private int a;
    private boolean b;
    private Y y;

    public void doStuff(int i) {
          synchronized (lockObject) {
                a = i;
                b = a == 8;
                y.someMethod(b);
                y = new Y(a, y);
          }
    }
}

这个

synchronized
块是否确保更新所有属性或仅写入锁定的属性(在这种情况下,锁定没有状态的最终对象实际上没有意义)?

或者我是否需要使用

volatile
来确保所有线程上的内存可见性更新:

class X {
    private final Object lockObject = new Object();
    private volatile int a;
    private volatile boolean b;
    private volatile Y y;

    public void doStuff(int i) {
          synchronized (lockObject) {
                a = i;
                b = a == 8;
                y.someMethod(b);
                y = new Y(a, y);
          }
    }
}

我实际上 99% 确定第一个是正确的,但不是 100%,感谢您的回答。

java synchronization volatile
1个回答
0
投票

第一个。

但是,仅在锁定此锁对象的其他线程之间的交互中。换句话说,如果 10 个线程同时调用

doStuff

  • 这 10 个线程各自以某种未定义的顺序运行代码。
  • 10 次执行中的每一次都会看到前一次执行的更新,并将其执行作为原子单元运行(即
    a == 8
    检查将看到自己的
    a = i
    ,保证作为
    a
    的状态。

无需声明这些字段

volatile

© www.soinside.com 2019 - 2024. All rights reserved.