1 . 保证了不同线程对该变量操作的内存可见性;
    2 . 禁止指令重排序

    volatile不适合复合操作

    volatile具有可见性、有序性,不具备原子性。

    在Java中,基本类型的变量的读取和赋值操作是原子性操作

    1. 原子性
    2. 基本类型的读取和赋值操作,且赋值必须是数字赋值给变量,变量之间的相互赋值不是原子性操作。
    3. java.concurrent.Atomic.* 包中所有类的一切操作

    可见性
    指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    有序性

    程序执行的顺序按照代码的先后顺序执行。

    最著名的例子就是单例模式里面的DCL(双重检查锁)。

    1. // volatile关键字会强制的保证线程的可见性
    2. private static boolean flag = true;
    3. private static void setI(boolean state) {
    4. System.out.println("线程设置了stop begin");
    5. flag = state; // 赋值 可见性测试,是否会使用高速缓存中的变量
    6. System.out.println("线程设置了stop end");
    7. }
    8. public static void main(String[] args) throws InterruptedException {
    9. Thread t1 = new Thread(() -> {
    10. System.out.println("进入方法" + flag);
    11. while (flag) {
    12. //System.out.println("方法执行");
    13. /**JVM会尽力保证内存的可见性 导致CPU的输出 耗时,CPU就有可能有时间去保证内存的可见性
    14. * public void println(String x) {
    15. * synchronized (this) {
    16. * print(x);
    17. * newLine();
    18. * }
    19. * }
    20. */
    21. }
    22. System.out.println("线程结束");
    23. });
    24. t1.start();
    25. Thread.sleep(1000);
    26. setI(false);
    27. }
    1. volatile 的区别,不加 线程一直存活,修改后的参数!未被读取。
    2. volatile 线程立刻停止,强制刷新主内存