为什么这个 java 类不是线程安全的。
class TestClass {
private int x;
int get() {
return x;
}
void set(int x) {
this.x = x;
}
}
我读到需要关键字 synchronized
才能使其线程安全?毕竟操作不是在原子内部完成的吗?
最佳答案
虽然赋值本身是一个原子操作,但是由于硬件和编译器实现的不同,不同的线程可能会看到成员x的不同值。即,由于某种缓存,一个线程的修改可能对另一个线程不可见。这通常称为线程可见性问题。
您可以通过在监视器上同步(使用 synchronized 关键字或 java.util.concurrent 锁)或通过将 x 声明为 volatile 来正确地同步您的代码。
关于java - Java类中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3602493/