我需要在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%,谢谢你的回答.

推荐答案

第一个.

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

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

不需要also声明这些字段volatile.

Java相关问答推荐

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

基于调车场算法的科学计算器

返回响应时,CamelCase命名约定不起作用

MySQL数据库中未应用具有Spring数据的唯一约束

如何从Keyloak映射Hibernate实体中的用户

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

将JSON字符串转换为Java类

Java页面筛选器问题

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

Android Studio模拟器没有互联网

Java中HashSet的搜索时间与TreeSet的搜索时间

Spring Validator批注不起作用

IntelliJ IDEA中的JavaFX应用程序无法在资源中找到CSS文件

如何调整JButton的大小以适应图标?

无泄漏函数的Java DRY

人们在 IntelliJ 上将-Dhttp.proxyHost=your.proxy.net -Dhttp.proxyPort=8080放在哪里?

Xml Reader 将 BMP 外部的字符解析为代理项对,这会导致无效的 xml

如何使用 JDBC 更改 Postgres Enum 类型