package com.allen.volatile_demo;
/**
* volatile解决可见性问题
* @author :jhys
* @date :Created in 2021/7/14 16:25
* @Description :
*/
public class MyThread extends Thread {
public static volatile int a = 0;
@Override
public void run() {
System.out.println("Thread-0线程开始执行,睡眠2秒钟,等待main线程线程执行!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-0线程,2秒钟之后开始执行,修改变量a的值为1!");
/*
变量被volatile关键字修饰之后,只要修改变量的值,
那么volatile关键字会让所有变量相关的变量副本都失效
线程在使用变量的时候,必须重新获取变量的值,生成新的变量副本
*/
a = 1;
System.out.println("Thread-0线程,执行线程任务结束了!"+a);
}
}
package com.allen.volatile_demo;
/**
* @author :jhys
* @date :Created in 2021/7/14 16:27
* @Description :
*/
public class Demo {
public static void main(String[] args) throws Exception{
MyThread myThread = new MyThread();
myThread.start();
System.out.println("main线程在开启Thread-0线程之后,继续执行main方法中的代码!");
System.out.println("main线程开始执行死循环!");
while (true) {
if (myThread.a == 1) {
System.out.println("main线程判断变量a的值==1,结束死循环!");
break;
}
}
}
}
main线程在开启Thread-0线程之后,继续执行main方法中的代码!
main线程开始执行死循环!
Thread-0线程开始执行,睡眠2秒钟,等待main线程线程执行!
Thread-0线程,2秒钟之后开始执行,修改变量a的值为1!
main线程判断变量a的值==1,结束死循环!
Thread-0线程,执行线程任务结束了!1
2.volatile解决有序性
注意:变量添加了volatile关键字,就不会在进行重排了
3.volatile不能解决原子性