首页 > 解决方案 > 在多线程环境中设置对象字段

问题描述

我有一个类 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);
        }
    }

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

标签: javamultithreading

解决方案


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

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

您遇到的问题是一个线程所做的更改不能保证对其他人可见。你需要一个记忆屏障来确保每个人都能看到他们的行为。鉴于您提供的信息,最简单的解决方法是声明 fields volatile


推荐阅读