证明volatile可见性问题--代码证明和原理解释!
程序员文章站
2022-07-12 14:14:20
...
目录
1.原理目标:演示可见性问题
1. 创建一个共享变量 2. 创建一条线程不断读取共享变量 3. 创建一条线程修改共享变量:两个的区别,一个修改线程是主线程,另一个修改线程是创建的子线程
代码展示
2.主线程修改展示和说明
package com.special.thread.volatiletest;
/**
* @author liuYC
* @ClassName VolatileDemo
* @Description TODO
* @date 2021/7/21 16:10
*
* 首先执行main方法的时候;
* 会创建出一个线程t1;
* 这个线程t1会来进行读取共享变量flag的取值;
* 则读取到flag共享变量的取值为true;
* 那么该while循环则将会一直进行循环;
* 那么当主线程沉睡了0.1秒之后,结束;
* 但是控制台显示,t1并没有结束;
*
* 如果加上volatile则会结束
*
*
*/
public class VolatileDemo {
static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while (flag) {
//
}
});
t1.start();
Thread.sleep(100);
flag = false;
System.out.println("main end");
}
}
3.另一个子线程修改展示说明:
package com.special.thread.volatiletest;
/**
* @author liuYC
* @ClassName VolatileDemo
* @Description TODO
* @date 2021/7/21 16:10
* <p>
* 首先执行main方法的时候;
*/
public class VolatileDemo2 {
/*
目标:演示可见性问题
1. 创建一个共享变量
2. 创建一条线程不断读取共享变量
3. 创建一条线程修改共享变量
*/
// 1. 创建一个共享变量;静态的成员变量;boolean类型名为flag;
private static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException {
/* 2. 创建一条线程不断读取共享变量
采用lambda表达式的方式进行创建线程
*/
new Thread(() -> {
while (flag) {
}
}).start();
/**
沉睡两秒钟;
让效果更加明显;
这样则更加明显的来分析问题
*/
Thread.sleep(2000);
new Thread(() -> {
// 将flag改为false;并且输出打印;
flag = false;
System.out.println("线程修改了变量的值为false");
}).start();
}
}
上一篇: 线代-矩阵