当前位置: 首页 > news >正文

Volatile 关键字提供的可见性

/*** 类说明:演示Volatile的提供的可见性*/
public class VolatileCase {// 说明:当ready没有volatile修饰时,执行结果是PrintThread线程一直处于被挂起状态,子线程感知不到主线程中的变量// 当ready被volatile修饰时,保证了ready的可见性,所以子线程感知到了主线程变量的值从而结束子线程,继续执行主线程private static boolean ready;// private volatile static boolean ready;private static int number;private static class PrintThread extends Thread {@Overridepublic void run() {System.out.println("PrintThread is running.......");while (!ready) ;//无限循环System.out.println("number = " + number);}}public static void main(String[] args) {new PrintThread().start();SleepTools.second(1);number = 51;ready = true;SleepTools.second(5);System.out.println("main is ended!");}
}

执行结果:

PrintThread is running.......
main is ended!

说明:PrintThread子线程未执行完被挂起,主线程执行完毕。这是因为子线程在执行时拿到的ready默认值是false,子线程感知不到下面语句对ready的重新赋值,所以一直在无限循环。

当用volatile修饰后:

private volatile static boolean ready;

再次执行:

PrintThread is running.......
number = 51
main is ended!

说明:子线程感知到主线程的变量ready变为了true,从而跳出循环,执行完成。这就是volatile关键字的作用---可见性。

volatile的缺点:它只保证可见性,不能保证在并发下的原子性。

什么是不能保证原子性?

就是多线程下,多个线程都可以对其修饰的变量或者对象进行修改,就像没有加synchronized一样,都可以进行修改。造成前后读到的值不一致。

volatule 适用场景:一写多读。就是一个线程在写,其他线程都是读取的情况。

http://www.lryc.cn/news/152281.html

相关文章:

  • Vue学习(三)
  • 贝锐蒲公英异地组网路由器如何设置虚拟串口功能?
  • MySQL 8.1.0 推出 InnoDB Cluster 只读副本
  • java并发编程 PriorityBlockingQueue详解
  • SpringMVC_基本使用
  • 大屏开发,浏览器的可视区域和设备的分辨率
  • 【微服务部署】06-日志集成
  • 【Python】python使用docxtpl生成word模板
  • C++学习笔记总结练习:多态与虚函数
  • linux 批量更改指定后辍文件的可执行权限
  • 数据结构(Java实现)-Map和Set
  • C++进程、线程、内存管理
  • 打车系统网约车系统开发支持APP公众号H5小程序版本源码
  • HTTP/1.1协议的状态码
  • SpringCloud(十)——ElasticSearch简单了解(一)初识ElasticSearch和RestClient
  • CAD文字显示?问号解决
  • Calico切换网络模式无效
  • 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成
  • iOS - 资源按需加载 - ODR
  • arduino仿真 SimulIDE1.0仿真器
  • vue实现导出excel的多种方式
  • redis实战-实现优惠券秒杀解决超卖问题
  • C语言:截断+整型提升+算数转换练习
  • Java后端开发面试题——多线程
  • Redis 学习笔记
  • 华为云新生代开发者招募
  • DockerFile简明教程
  • Cygwin是什么?是Windows还是Linux?
  • 成集云 | 多维表格自动化管理jira Server项目 | 解决方案
  • 数据结构(Java实现)-排序