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

时间:2019-05-21 02:42:03

标签: 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);
        }
    }

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

1 个答案:

答案 0 :(得分:0)

这不是线程安全的,但不是由于竞争条件。

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

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