标签:class 跳出循环 ring tac rup start oid OLE try
测试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修饰变量 在线程中的 可见性
标签:class 跳出循环 ring tac rup start oid OLE try
原文地址:https://www.cnblogs.com/wanjun-top/p/12818107.html