java - 在多线程环境中设置对象字段

标签 java multithreading

我有一个类 M,它有两个 setter 方法 setA() 和 setB(),它们基本上分别设置两个字段 A 和 B。

Class M {
        private Object A;
        private Object B;

        public void setA (Object A) {
           this.A = A;
        }
        public void setB (Object B) {
           this.B = B;
        }
    }

我有两个独立的构建器 BuildA 和 BuildB,它们采用 M 的对象并构建/设置字段 A 和字段 B。

Class BuildA {
    public void build(M m) {
        // Some code to build A
        m.setA(A);
    }
}


Class BuildB {
        public void build(M m) {
            // Some code to build B
            m.setB(B);
        }
    }

如果我在多线程环境中运行这两个构建器,是否会出现竞争条件?它是线程安全的吗?

最佳答案

这不是线程安全的,但不是因为竞争条件。

当系统可能处于不良状态(具体取决于不同线程的执行顺序)时,就会出现竞争条件。正如您所描述的,这些字段是独立的,并且没有需要避免的无效状态。

您遇到的问题是,一个线程所做的更改不能保证对任何其他线程都可见。你需要一个内存屏障来确保他们的行为被每个人看到。根据您提供的信息,最简单的修复方法是声明字段 volatile

关于java - 在多线程环境中设置对象字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56230416/

相关文章:

java - 使用 JDO 从数据存储区存储和检索数据

java - 如何使用java去除URL中的空格?

java - 如何在Java中让递归和for循环一起工作?

multithreading - 为什么boost::shared_ptr在不是线程安全的情况下会麻烦原子引用计数?

c++ - 线程问题

java - 如何高效地锁定代码块以避免乐观锁异常

java - 当我从我的 android 应用程序请求 http 页面时,移动关键字被添加到 url

java - 主线程等待两个并行子线程java

c# - 在某些情况下,最好使用普通的旧 Thread 对象而不是较新的构造之一吗?

wpf - 如何处理跨线程访问异常?