volatile 可见性的测试
Posted wanjun-top
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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修饰变量 在线程中的 可见性
以上是关于volatile 可见性的测试的主要内容,如果未能解决你的问题,请参考以下文章