我有一个具有两个setter方法seta((和setb((的类M,基本上分别设置了两个字段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
。