dev*_*ull 16 java thread-safety
为什么这个java类不是Thread安全的.
class TestClass {
private int x;
int get() {
return x;
}
void set(int x) {
this.x = x;
}
}
Run Code Online (Sandbox Code Playgroud)
我读到需要关键字synchronized
来使其线程安全吗?毕竟不是在原子内完成的操作?
Eya*_*der 12
虽然赋值本身是一个原子操作,但由于硬件和编译器的实现不同,不同的线程可能会看到成员x的不同值.即,由于某种缓存,一个线程的修改对于另一个线程可能是不可见的.这通常称为线程可见性问题.
您可以通过在监视器上同步(使用synchronized关键字或java.util.concurrent锁)或声明x为volatile来正确同步代码.
由于字段"x"未声明为volatile,因此不需要JVM确保"x"对所有其他线程可见.也就是说,如果一个线程不断地读取'x'的值并且另一个线程正在写它,那么读取线程可能永远不会"看到"值的变化.
不需要synchronized关键字,但它将起作用,因为它将创建必要的内存屏障/缓存刷新以确保'x'可见,但在这种情况下使用volatile关键字将更有效.