java - 在多线程环境中设置对象字段
问题描述
我有一个类 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);
}
}
如果我在多线程环境中运行这两个构建器,是否会出现竞争条件?它会是线程安全的吗?
解决方案
这不是线程安全的,但不是因为竞争条件。
当系统根据不同线程的执行顺序可能处于不良状态时,就会出现竞争条件。正如您所描述的,这些字段是独立的,并且没有要避免的无效状态。
您遇到的问题是一个线程所做的更改不能保证对其他人可见。你需要一个记忆屏障来确保每个人都能看到他们的行为。鉴于您提供的信息,最简单的解决方法是声明 fields volatile
。
推荐阅读
- java - 连接 web.xml 中的环境条目
- tensorflow - 使用 TensorFlow 的字符串模式分类器
- javascript - 猫鼬没有输出我想要的东西
- shiny - 如何在 radioGroupButtons 的按钮之间获得更多空间并包含图标
- java - 删除一对一关系上的 jpa 实体
- javascript - 如何使列表项可点击并导航到另一个页面?
- c# - ApplicationDbContext 在从 Web 套接字订阅访问时被释放
- python - 二维点云中的线检测
- python - cmappertools 安装失败
- scala - 组合具有多个参数的函数与多个参数列表