zoukankan      html  css  js  c++  java
  • volatile 可见性的测试

     测试volatile 的线程的可见性

     1 public class VolatileTest {
     2 
     3     private static boolean flag = true; //不用volatile修饰
     4 
     5     public static void main(String[] args) throws InterruptedException {
     6         new Thread1().start();
     7         Thread.sleep(1000); //暂停1秒 保证线程1 启动并运行。
     8         new Thread2().start();
     9     }
    10 
    11     /**
    12      * 线程1 一个循环,如果 flag为false 跳出循环
    13      */
    14     static class Thread1 extends Thread {
    15         @Override
    16         public void run() {
    17             while (flag) {
    18 
    19             }
    20             System.out.println("thread1-run");
    21         }
    22     }
    23 
    24     /**
    25      * 线程2  2秒后将flag改成false
    26      */
    27     static class Thread2 extends Thread {
    28         @Override
    29         public void run() {
    30             try {
    31                 Thread.sleep(2000);
    32             } catch (InterruptedException e) {
    33                 e.printStackTrace();
    34             }
    35             System.out.println("Thread2-run");
    36             flag = false;
    37             System.out.println("flag 被改成false");
    38         }
    39     }
    40 }

    运行结果:

    程序一直处于运行中,说明线程2 将flag更改为flag后,线程1 并不知道

    接着将第三行的代码 改成

    private static volatile boolean flag = true;

    重新运行:

    此时线程1 感知到flag 变成了flag;跳出循环,输出  thread1-run

    说明 volatile修饰变量 在线程中的 可见性

  • 相关阅读:
    4.6--4.9
    4.表达式和运算符
    3.9--3.10
    3.8
    泛型(Generic)
    容器
    String,StringBuffer
    数组
    异常,自定义异常,异常重写
    多态,抽象类和抽象方法,接口
  • 原文地址:https://www.cnblogs.com/wanjun-top/p/12818107.html
Copyright © 2011-2022 走看看