Java 为什么volatile可以';当一个或多个线程将写入值时,不能使用
许多文档提示,当一个或多个线程写入值时,我们不能使用Java 为什么volatile可以';当一个或多个线程将写入值时,不能使用,java,multithreading,volatile,Java,Multithreading,Volatile,许多文档提示,当一个或多个线程写入值时,我们不能使用volatile,例如,有一个布尔对象isRun,如果两个或多个线程调用setIsRun(true/false),我们不能使用volatile来修饰变量count 正如我所知,volatile可以使所有线程都能看到最新的值,那么为什么我们不能在上述情况下使用它呢?任何人都可以告诉我,谢谢 正如你所说 volatile-保证线程之间的可见性 synchronized-保证线程之间的原子性和可见性 例如: 假设有两个线程A和B都可以访问以下变量 p
volatile
,例如,有一个布尔对象isRun
,如果两个或多个线程调用setIsRun(true/false)
,我们不能使用volatile
来修饰变量count
正如我所知,volatile
可以使所有线程都能看到最新的值,那么为什么我们不能在上述情况下使用它呢?任何人都可以告诉我,谢谢 正如你所说
volatile
-保证线程之间的可见性
synchronized
-保证线程之间的原子性和可见性
例如:
假设有两个线程A和B都可以访问以下变量
public volatile int count = 0;
如果线程A执行以下操作
count++;
不能保证JVM执行++
操作,这是实际的3个JVM操作(读、增量、写)原子化。如果存在争用条件,线程B很可能会看到过时值被分配给count
如果想要原子性,需要使用synchronized
例如:
假设有两个线程A和B都可以访问以下变量和increment
方法
private volatile int count = 0;
public synchronized void increment() {
count++;
}
现在,如果线程A进入
increment
方法,它将获取一个实例级监视器锁,只有当它存在increment
方法时才会释放该锁。这保证了JVM指令读取、递增、写入一个接一个地执行。问题是关于布尔值的。对不起,我已将问题更新为关于boolean
变量,因此它与原子性无关。