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
变量,因此它与原子性无关。