/**
*
* volatile 关键字,使一个变量在多个线程间可见
* A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道
*
* 使用volatile关键字,会让所有线程都会读到变量的修改值
*
* 在下面的代码中,running是存在于堆内存的t对象中
*
* 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并不会每次
* 都去读取堆内存,这样当线程修改running的值之后,t1线程感知不到,所以不会停止运行
*
* 使用volatile,将会强制所有线程都会去堆内存中读取running的值
*
* volatile并不能保证多个线程共同修改running变量时所带来的不一致问题,也就是说volatile不能替代synchronized
*
*
* volatile 的作用:
* 保证线程可见性
* 禁止指令重排(这里不做过多解释 自行百度即可 比较难出现而已)
*
* 注意:volatile不能保证原子性 不能替代synchronized
*
*/
public class T01_HelloVolatile {
/*volatile*/ boolean flag = true; //对比一下有无volatile的情况下,整个程序运行结果的区别
public void m(){
System.out.println("start");
while(flag){
}
System.out.println("end");
}
public static void main(String[] args) {
T01_HelloVolatile t = new T01_HelloVolatile();
new Thread(t::m).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// t.m();
// }
// }).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.flag = false;
}
}
java 多线程volatile的作用
最新推荐文章于 2024-03-20 04:28:51 发布