在原子性、可见性、有序性中,volatile关键字主要在可见性中发挥作用。
volatile声明的变量对所有线程来说是可见的,就是说当变量的值发生改变的时候,其他线程可以立马发现这个变化。
public class Main {
private static boolean isRuning;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!isRuning) {
System.out.println(number);
}
}
}
public static void main(String[] args) throws InterruptedException {
new ReaderThread().start();
Thread.sleep(1000);
number = 42;
isRuning = true;
Thread.sleep(1000);
}
}
应该是由于编译器优化的存在,这里变量虽然没有被volatile修饰,但是仍然对其他线程可见。。。。。
那为啥Volatile修饰的变量i++却会有并发问题呢?
因为i++并不是原子操作,
i++是有两步操作的,比如 i=0; i++
1.读取i=0