JavaWeb9-volatile解决内存可见性和指令重排序问题
目录
1.解决内存可见性问题
2.解决指令重排序问题
3.volatile缺点
4.特使使用场景
volatile(易变的,易挥发的,不稳定的)可以解决内存可见性和指令重排序的问题。
1.解决内存可见性问题
代码在写入 volatile 修饰的变量时:
- 改变线程⼯作内存中volatile变量副本的值。
- 将改变后的副本的值从⼯作内存刷新到主内存。
代码在读取 volatile 修饰的变量时:
- 从主内存中读取volatile变量的最新值到线程的⼯作内存中。
- 从⼯作内存中读取volatile变量的副本。
给全局变量加上volatile关键字:
import java.time.LocalDateTime;/*** 解决内存可见性问题*/
public class ThreadDemo18 {//全局变量(类级别)private static volatile boolean flag = true;public static void main(String[] args) {//创建子线程1Thread t1 = new Thread(() -> {System.out.println("线程 1:开始执行!" + LocalDateTime.now());while(flag) {}System.out.println("线程 1:结束执行!" + LocalDateTime.now());});t1.start();//创建子线程2Thread t2 = new Thread(() -> {//休眠1stry {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程 2:修改 flag = false!" + LocalDateTime.now());flag = false;});t2.start();}
}
2.解决指令重排序问题
volatile关键字就像一个警告/声明:不允许编译器进行指令优化,JVM就会听程序员的话,不会进行指令优化了。
3.volatile缺点
- 直接访问⼯作内存(实际是 CPU 的寄存器或者 CPU 的缓存),速度⾮常快,但是可能出现数据不⼀致的情况。加上volatile,强制读写内存,速度是慢了,但是数据变的更准确了。
- 它解决不了原子性问题↓ =》使用volatile并不能完全解决线程安全问题,所以volatile也叫轻量级的“锁”。
public class ThreadDemoVolatile {static class Counter{//变量private volatile int number = 0;//循环次数private int MAX_COUNT = 0;public Counter(int MAX_COUNT) {this.MAX_COUNT = MAX_COUNT;}//++方法public void incr() {for (int i = 0; i < MAX_COUNT; i++) {number++;}}//--方法public void decr() {for (int i = 0; i < MAX_COUNT; i++) {number--;}}public int getNumber() {return number;}}public static void main(String[] args) throws InterruptedException {Counter counter = new Counter(100000);Thread t1 = new Thread(() -> {counter.incr();});t1.start();Thread t2 = new Thread(() -> {counter.decr();});t2.start();t1.join();t2.join();System.out.println("最终的结果:" + counter.getNumber());}
}
![](https://img-blog.csdnimg.cn/4993447660ec46508427d72b00a04abc.png)
4.特使使用场景
单例模式,需要提供一个变量,对外进行访问,那个变量必须要加volatile。
相关文章:
![](https://img-blog.csdnimg.cn/4993447660ec46508427d72b00a04abc.png)
JavaWeb9-volatile解决内存可见性和指令重排序问题
目录 1.解决内存可见性问题 2.解决指令重排序问题 3.volatile缺点 4.特使使用场景 volatile(易变的,易挥发的,不稳定的)可以解决内存可见性和指令重排序的问题。 1.解决内存可见性问题 代码在写入 volatile 修饰的变量时&am…...
![](https://img-blog.csdnimg.cn/img_convert/53633ad25dfc6e62d318268d73880e78.jpeg)
Docker - 镜像操作命令
镜像名称一般分为两部分组成:[repository]:[tag]在没有指定tag时,默认是latest,代表最新版本的镜像1.下载docker镜像 docker pull repository:tag2.查看本地所有镜像 docker images3.创建镜像别名 docker tag repository:tag repository111:tag4.查看镜像…...
![](https://img-blog.csdnimg.cn/img_convert/9eaa0d8a886734b77f4fe0070566b2de.gif)
全栈之路-前端篇 | 第三讲.基础前置知识【前端标准与研发工具】学习笔记
欢迎关注「全栈工程师修炼指南」公众号 点击 👇 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! 涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识 “ 花开堪折直须折,莫待无花…...
![](https://img-blog.csdnimg.cn/a87bdb434eb6470199e2736eeeb22b53.png)
Tomcat 线上调优记录
原始Tomcat配置 启动参数Plaintext-Xms256m -Xmx512m -XX:MaxPermSize128m Tomcat 参数配置XML<Executor name"tomcatThreadPool" namePrefix"catalina-exec-" maxThreads"1500" minSpareThreads"50" maxIdleTime"600000&q…...
![](https://www.ngui.cc/images/no-images.jpg)
学习 Python 之 Pygame 开发坦克大战(四)
学习 Python 之 Pygame 开发坦克大战(四)坦克大战添加音效1. 初始化音效2. 加入游戏开始音效和坦克移动音效3. 添加坦克开火音效4. 添加装甲削减音效5. 添加坦克爆炸音效6. 添加子弹击中边界音效坦克大战添加音效 我的素材放到了百度网盘里,…...
![](https://img-blog.csdnimg.cn/img_convert/ec43f7f5f6b0ceacae649c4038099600.png)
New和Malloc的使用及其差异
1,new的使用关于new的定义:new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。通常来说,当在局部函数中new出一段新的空间,该…...
![](https://www.ngui.cc/images/no-images.jpg)
2023年细胞生物学复习汇总
细胞分化 1.什么是细胞分化?细胞分化的特点是什么? 答:(1)细胞分化(cell differentiation)是指同一来源的细胞逐渐产生出形态结构、功能特征各不相同的细胞类群的过程,其结果是在空间…...
![](https://img-blog.csdnimg.cn/img_convert/f5d8adf8b59b476bae061c0327e633ec.png)
光伏VSG-基于虚拟同步发电机的光伏并网逆变器系统MATLAB仿真
采用MATLAB2021b仿真!!!仿真模型1光伏电池模块(采用MATLAB自带光伏模块)、MPPT控制模块、升压模块、VSG控制模块、电流滞环控制模块。2s时改变光照强度 !!!VSG输出有功功率、无功功率…...
![](https://img-blog.csdnimg.cn/be6ef26cd5564380ac3b44e5512dde59.jpeg#pic_center)
高可用 - 02 Keepalived_VRRP工作原理
文章目录Keepalived VS HeartbeatKeepalived的用途VRRP与工作原理物理路由器和虚拟路由器Keepalived VS Heartbeat Keepalived是Linux下一个轻量级的高可用解决方案,它与Heartbeat、RoseHA实现的功能类似,都可以实现服务或者网络的高可用,但…...
![](https://img-blog.csdnimg.cn/5cb7f24ce3504f45a0c043d24cbe0680.png)
vue实现xml在线编辑功能
先看效果 避免误会 这是一个在线编辑器 我们可以在这上面随意的编写xml代码格式 我们修改上面的内容之后 就可以在控制台输出内容 如果这正是您想要的东西 那就可以先创建一个vue项目 我们先引入依赖 npm install brace -S npm install element-ui -S npm install vue-cli…...
![](https://www.ngui.cc/images/no-images.jpg)
GitHub Workflow
GitHub Workflow 基本流程 把远程仓库克隆到本地 git clone xxxx.git在本地切换至新的分支 git checkout -b new_branch修改本地仓库的文件 项目修改完成后,查看修改的内容 git diff上传修改之后的内容到本地暂存区 git add modified_files将本地暂存区的代码更新…...
![](https://www.ngui.cc/images/no-images.jpg)
vue学习
vue 其实你只要安装一个vue-cli 就可以了 vue-cli 你可以用比较高的版本 这 当然是 可以滴...
![](https://img-blog.csdnimg.cn/4e7972bed10c49bc99e944f84f96e2cc.png)
Windows使用ssh协议远程连接ubuntu linux系统
Windows使用ssh协议远程连接ubuntu linux系统一、Windows远程连接ubuntu linux系统二、开启ubuntu ssh服务三、获取ubuntu子系统的ip地址四、从windows上通过ssh连接到ubuntu子系统五、设置ubuntu系统ssh自启动(18.04)一、Windows远程连接ubuntu linux系…...
![](https://www.ngui.cc/images/no-images.jpg)
大数据处理 - Overview
本文主要介绍大数据处理的一些思路。何谓海量数据处理?所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次…...
![](https://img-blog.csdnimg.cn/5446fd91dd5a4535bdd7279e357e9fcf.png)
12-Composer的配置与使用详解
1、自定义类与非类的自动加载与测试 # composer> php 包管理工具 ,类似npm1.自己写的类,函数,接口,常量等全局成员,通过自动加载来实现按需加载 2.自己写的代码,有哪些依赖,用到了哪些外部成…...
![](https://www.ngui.cc/images/no-images.jpg)
RK3566开启wifi自适应
系统:linux(buildroot) 一、修改Makefile,使能RTW_ADAPTIVITY 文件路径:..\x3566_linux_v1.2.0\kernel\drivers\net\wireless\rockchip_wlan\rtl8821cs\Makefile 第74行: CONFIG_RTW_ADAPTIVITY_EN disable 改为: CONFIG_RTW_ADAPTIVITY_EN enab…...
![](https://www.ngui.cc/images/no-images.jpg)
shell编程之变量定义
typora-copy-images-to: pictures typora-root-url: …\pictures 文章目录typora-copy-images-to: pictures typora-root-url: ..\..\pictures一、SHELL介绍㈠ 什么是shell脚本?㈡ 什么时候用到脚本?㈢ shell脚本能干啥?㈣ 如何学习shell脚本?㈤ 学习s…...
![](https://img-blog.csdnimg.cn/img_convert/9243fb37a8b68a34473dc67d881e16a2.png)
Spring Cloud Alibaba 微服务简介
微服务简介 1 什么是微服务 2014年,Martin Fowler(马丁福勒 ) 提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动…...
![](https://www.ngui.cc/images/no-images.jpg)
【调试】GDB使用总结
启动 在shell下敲gdb命令即可启动gdb,启动后会显示下述信息,出现gdb提示符。 ➜ example gdb GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3: GNU GPL v…...
![](https://img-blog.csdnimg.cn/da1884cedd4447c9b8d55574662870c9.png)
基于Spring、Spring MVC、MyBatis的招聘管理系统
文章目录项目介绍主要功能截图:首页账户管理招聘建议部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 …...
![](https://img-blog.csdnimg.cn/1f6024a052f94991963c9b31dd50c759.png)
软件测试基础
文章目录前言一、软件测试入门1.什么是软件测试?2.测试和开发的区别3.调试和测试的区别4.一些常问面试题5.测试人员需要具备的素质二、软件测试基础1.需求2.测试用例3.Bug4.软件的生命周期5.开发模型三、Bug1.如何创建bug2.Bug的级别3.Bug的生命周期4.跟开发产生争执…...
![](https://img-blog.csdnimg.cn/img_convert/f9328b5b173e407f8e9b292dba1949c8.png)
【算法基础】链表
一、单链表例题:实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k个插入的数后面的数;在第 k� 个插入的数后插入一个数。现在要对该链表进行 M次操作,进行完所…...
![](https://img-blog.csdnimg.cn/b5471d54472a44daa356d613101dbfa2.png)
[AUTOSAR][Fls模块] Flash Driver Module
Flash Driver Module--jianqiang.xue一、 简介二、 措施方式一:将FLASH操作程序作为Bootloader组件的一部分固化在存储器中方式二:通过通讯口将该部分代码从上位机下载到指定的RAM方式三:将Flash功能函数作为数据运行(推荐!&#…...
![](https://img-blog.csdnimg.cn/img_convert/daa85cc12cbff468fa28b7399f870fff.jpeg)
如何正确选择好用的投票平台微信公众平台投票链接链接投票平台
“年度人物楷模”网络评选投票_免费链接投票_作品投票通道_扫码投票怎样进行现在来说,公司、企业、学校更多的想借助短视频推广自己。通过微信投票小程序,网友们就可以通过手机拍视频上传视频参加活动,而短视频微信投票评选活动既可以给用户发…...
![](https://img-blog.csdnimg.cn/img_convert/9e144804e9ab8d53964081b8e03cf908.png)
gocd部署应用
产品需要在多个环境部署测试,为了提高部署测试效率,故计划使用CD工具,jenkins确实足够强大,但是使用部署功能是需要安装插件的,再说自己本身只用部署功能,故决定找一个小巧的CD工具,经过一番查找…...
![](https://img-blog.csdnimg.cn/08c10ad5eca54e6ba6cd060d64c5bebd.png)
P2P视频聊天技术分析
整个P2P视频过程需要知道双方的媒体类型、流和候选者,所以这里就会用到一下技术: 信令服务器socket.io 状态机 ICE服务器 WebRTC框架 媒体协商 信令服务器Socket.io 信令服务器说白了作用就是发消息的中转站,A把msg发到…...
![](https://img-blog.csdnimg.cn/8502bf7c408841d2a313919149491d8b.png)
MyBatis 的一级、二级缓存机制
目录标题缓存什么是缓存为什么使用缓存什么样的数据能使用缓存,什么样的数据不能使用适用于缓存不适用于缓存MyBatis 一级缓存、二级缓存关系1. 一级缓存1.1 什么是一级缓存mybatis1.2 一级缓存配置1.3 什么情况下会命中一级缓存mybatis清除一级缓存的几种方法1.4 内…...
![](https://www.ngui.cc/images/no-images.jpg)
剑指 Offer 65. 不用加减乘除做加法
摘要 剑指 Offer 65. 不用加减乘除做加法 一、位运算 有符号整数通常用补码来表示和存储,补码具有如下特征: 正整数的补码与原码相同;负整数的补码为其原码除符号位外的所有位取反后加 11。可以将减法运算转化为补码的加法运算来实现。符…...
![](https://www.ngui.cc/images/no-images.jpg)
5年软件测试年薪30w+,我的坎坷之路谁又知道
在深圳做了五年软件测试工作,从之前的一脸懵的点点点,到现在会自动化测试,说一点点非计算机专业人员从事软件测试的心得体会,仅供参考交流。 大部分测试在公司没啥地位,当然如果你懂技术就还行,单纯点点点…...
![](https://img-blog.csdnimg.cn/6dd11855af644d9c97dea427243e24d2.png)
【Opencv--自适应图像二值化】cv2.adaptiveThreshold()
【Opencv–adaptiveThreshold】自适应阈值图像二值化 文章目录【Opencv--adaptiveThreshold】自适应阈值图像二值化1. 介绍2. adaptiveThreshold函数2.1 函数调用2.2 补充说明3. 代码示例4. 效果4.1 原图(ori.img)4.2 处理后5. 参考1. 介绍 在这里 cv2.…...
![](/images/no-images.jpg)
网站建设青岛公司/企业网站优化公司
据说有人给酒肆的老板娘出了一个难题:此人明明知道店里只有两个舀酒的勺子,分别能舀7两和11两酒,却硬要老板娘卖给他2两酒。聪明的老板娘毫不含糊,用这两个勺子在酒缸里舀酒,并倒来倒去,居然量出了2两酒&am…...
![](/images/no-images.jpg)
wordpress微信机器人破解版/网络推广合作协议范本
羽毛球比赛规则: 1、21分制,三局两胜为佳 2、每球得分制 3、每回合中取胜的一方的一分 4、双方均为20分时,领先对方2分一方获胜 5、双方均为29分时,先到达30分一方获胜 6、一局比赛中获胜方在下一局率先开球 代码如下:…...
![](https://img-blog.csdnimg.cn/img_convert/355801b8b6b5d28ebfec7f872890dea5.png)
定制网站建设多少钱/手机优化大师官网
创建工程之前,首先需要安装DevEco Studio 打开DevEco Studio,点击Create Project。如果已有一个工程,则点击File>New>New project。 进入选择ability template界面,选择Empty Ability。 安装HarmonyOS sdk。 进入配置工…...
![](/images/no-images.jpg)
wordpress twenty thirteen/快手seo软件下载
环境Centos 6.6Mysql 5.7安装如果系统已安装,请先卸载!关闭Selinuxsetenforce 0 (临时关闭) 修改/etc/selinux/config(永久关闭)将SELINUXenforcing改为SELINUXdisabled1. 下载依赖包和mysql的安装包官网下载解压:wget http://cdn.mysql.com/archives/my…...
![](http://www.gxlcms.com/Uploads-s/new/2019-11-04-201904-Python/5ce36078b6fb1219.jpg)
新网网站备案流程/打广告推广怎么做
在Python中::-1表示将字符或数字倒序输出。举个栗子,当line "abcde"时,使用语句line[::-1],最后的运行结果为:edcba。下面请看详细解释。一、反转 ::-1涉及到将数字或字符…...
![](https://img-blog.csdnimg.cn/20190515115548342.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9kcGItYm9ib2thb3lhLXNtLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70)
工作感悟及心得/网站优化怎么操作
model.addAttribute(“msg”,“th:text使用”); model.addAttribute(“s1”,“abcdefg”); model.addAttribute(“s2”,“AbCdEfG”); model.addAttribute(“s3”,“abc123”); return “t2”; } 2.日期格式化处理 | 表达式 | 说明 | | :-- | :-- | | ${#dates.format(k…...