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

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缺点

  1. 直接访问⼯作内存(实际是 CPU 的寄存器或者 CPU 的缓存),速度⾮常快,但是可能出现数据不⼀致的情况。加上volatile,强制读写内存,速度是慢了,但是数据变的更准确了。
  2. 解决不了原子性问题=》使用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());}
}

4.特使使用场景

单例模式,需要提供一个变量,对外进行访问,那个变量必须要加volatile。

相关文章:

JavaWeb9-volatile解决内存可见性和指令重排序问题

目录 1.解决内存可见性问题 2.解决指令重排序问题 3.volatile缺点 4.特使使用场景 volatile&#xff08;易变的&#xff0c;易挥发的&#xff0c;不稳定的&#xff09;可以解决内存可见性和指令重排序的问题。 1.解决内存可见性问题 代码在写入 volatile 修饰的变量时&am…...

Docker - 镜像操作命令

镜像名称一般分为两部分组成:[repository]:[tag]在没有指定tag时&#xff0c;默认是latest&#xff0c;代表最新版本的镜像1.下载docker镜像 docker pull repository:tag2.查看本地所有镜像 docker images3.创建镜像别名 docker tag repository:tag repository111:tag4.查看镜像…...

全栈之路-前端篇 | 第三讲.基础前置知识【前端标准与研发工具】学习笔记

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识 “ 花开堪折直须折&#xff0c;莫待无花…...

Tomcat 线上调优记录

原始Tomcat配置 启动参数Plaintext-Xms256m -Xmx512m -XX:MaxPermSize128m Tomcat 参数配置XML<Executor name"tomcatThreadPool" namePrefix"catalina-exec-" maxThreads"1500" minSpareThreads"50" maxIdleTime"600000&q…...

学习 Python 之 Pygame 开发坦克大战(四)

学习 Python 之 Pygame 开发坦克大战&#xff08;四&#xff09;坦克大战添加音效1. 初始化音效2. 加入游戏开始音效和坦克移动音效3. 添加坦克开火音效4. 添加装甲削减音效5. 添加坦克爆炸音效6. 添加子弹击中边界音效坦克大战添加音效 我的素材放到了百度网盘里&#xff0c;…...

New和Malloc的使用及其差异

1&#xff0c;new的使用关于new的定义&#xff1a;new其实就是告诉计算机开辟一段新的空间&#xff0c;但是和一般的声明不同的是&#xff0c;new开辟的空间在堆上&#xff0c;而一般声明的变量存放在栈上。通常来说&#xff0c;当在局部函数中new出一段新的空间&#xff0c;该…...

2023年细胞生物学复习汇总

细胞分化 1.什么是细胞分化&#xff1f;细胞分化的特点是什么&#xff1f; 答&#xff1a;&#xff08;1&#xff09;细胞分化&#xff08;cell differentiation&#xff09;是指同一来源的细胞逐渐产生出形态结构、功能特征各不相同的细胞类群的过程&#xff0c;其结果是在空间…...

光伏VSG-基于虚拟同步发电机的光伏并网逆变器系统MATLAB仿真

采用MATLAB2021b仿真&#xff01;&#xff01;&#xff01;仿真模型1光伏电池模块&#xff08;采用MATLAB自带光伏模块&#xff09;、MPPT控制模块、升压模块、VSG控制模块、电流滞环控制模块。2s时改变光照强度 &#xff01;&#xff01;&#xff01;VSG输出有功功率、无功功率…...

高可用 - 02 Keepalived_VRRP工作原理

文章目录Keepalived VS HeartbeatKeepalived的用途VRRP与工作原理物理路由器和虚拟路由器Keepalived VS Heartbeat Keepalived是Linux下一个轻量级的高可用解决方案&#xff0c;它与Heartbeat、RoseHA实现的功能类似&#xff0c;都可以实现服务或者网络的高可用&#xff0c;但…...

vue实现xml在线编辑功能

先看效果 避免误会 这是一个在线编辑器 我们可以在这上面随意的编写xml代码格式 我们修改上面的内容之后 就可以在控制台输出内容 如果这正是您想要的东西 那就可以先创建一个vue项目 我们先引入依赖 npm install brace -S npm install element-ui -S npm install vue-cli…...

GitHub Workflow

GitHub Workflow 基本流程 把远程仓库克隆到本地 git clone xxxx.git在本地切换至新的分支 git checkout -b new_branch修改本地仓库的文件 项目修改完成后&#xff0c;查看修改的内容 git diff上传修改之后的内容到本地暂存区 git add modified_files将本地暂存区的代码更新…...

vue学习

vue 其实你只要安装一个vue-cli 就可以了 vue-cli 你可以用比较高的版本 这 当然是 可以滴...

Windows使用ssh协议远程连接ubuntu linux系统

Windows使用ssh协议远程连接ubuntu linux系统一、Windows远程连接ubuntu linux系统二、开启ubuntu ssh服务三、获取ubuntu子系统的ip地址四、从windows上通过ssh连接到ubuntu子系统五、设置ubuntu系统ssh自启动&#xff08;18.04&#xff09;一、Windows远程连接ubuntu linux系…...

大数据处理 - Overview

本文主要介绍大数据处理的一些思路。何谓海量数据处理?所谓海量数据处理&#xff0c;无非就是基于海量数据上的存储、处理、操作。何谓海量&#xff0c;就是数据量太大&#xff0c;所以导致要么是无法在较短时间内迅速解决&#xff0c;要么是数据太大&#xff0c;导致无法一次…...

12-Composer的配置与使用详解

1、自定义类与非类的自动加载与测试 # composer> php 包管理工具 &#xff0c;类似npm1.自己写的类&#xff0c;函数&#xff0c;接口&#xff0c;常量等全局成员&#xff0c;通过自动加载来实现按需加载 2.自己写的代码&#xff0c;有哪些依赖&#xff0c;用到了哪些外部成…...

RK3566开启wifi自适应

系统:linux(buildroot) 一、修改Makefile,使能RTW_ADAPTIVITY 文件路径:..\x3566_linux_v1.2.0\kernel\drivers\net\wireless\rockchip_wlan\rtl8821cs\Makefile 第74行&#xff1a; CONFIG_RTW_ADAPTIVITY_EN disable 改为&#xff1a; CONFIG_RTW_ADAPTIVITY_EN enab…...

shell编程之变量定义

typora-copy-images-to: pictures typora-root-url: …\pictures 文章目录typora-copy-images-to: pictures typora-root-url: ..\..\pictures一、SHELL介绍㈠ 什么是shell脚本&#xff1f;㈡ 什么时候用到脚本?㈢ shell脚本能干啥?㈣ 如何学习shell脚本&#xff1f;㈤ 学习s…...

Spring Cloud Alibaba 微服务简介

微服务简介 1 什么是微服务 2014年&#xff0c;Martin Fowler&#xff08;马丁福勒 &#xff09; 提出了微服务的概念&#xff0c;定义了微服务是由以单一应用程序构成的小服务&#xff0c;自己拥有自己的进程与轻量化处理&#xff0c;服务依业务功能设计&#xff0c;以全自动…...

【调试】GDB使用总结

启动 在shell下敲gdb命令即可启动gdb&#xff0c;启动后会显示下述信息&#xff0c;出现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…...

基于Spring、Spring MVC、MyBatis的招聘管理系统

文章目录项目介绍主要功能截图&#xff1a;首页账户管理招聘建议部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 …...

剑指offer刷题记录

pass区 03 数组中重复的数字剑指 Offer 05. 替换空格剑指 Offer 58 - II. 左旋转字符串剑指 Offer 06. 从尾到头打印链表剑指 Offer 18. 删除链表的节点剑指 Offer 22. 链表中倒数第k个节点剑指 Offer 25. 合并两个排序的链表剑指 Offer 21. 调整数组顺序使奇数位于偶数前面剑…...

AI辅助开发:探索快马AI生成智能命令提示与分析的下一代终端工具

今天想和大家分享一个有趣的开发实践&#xff1a;如何用前端技术模拟实现一个具备AI辅助功能的智能命令行终端Web应用。这个项目的灵感来源于日常开发中频繁使用终端工具时遇到的痛点&#xff0c;比如记不住复杂命令、报错信息难以理解等问题。 基础终端界面搭建 首先需要创建一…...

3分钟掌握RPG Maker游戏资源解密技巧:浏览器工具让素材提取效率飙升80%

3分钟掌握RPG Maker游戏资源解密技巧&#xff1a;浏览器工具让素材提取效率飙升80% 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址:…...

Vant Weapp组件库无障碍颜色方案实践指南

Vant Weapp组件库无障碍颜色方案实践指南 【免费下载链接】vant-weapp 轻量、可靠的小程序 UI 组件库 项目地址: https://gitcode.com/gh_mirrors/va/vant-weapp 问题引入&#xff1a;被忽视的视觉障碍用户体验痛点 在小程序开发中&#xff0c;颜色设计往往聚焦于视觉美…...

效率提升实测:OpenClaw+百川2-13B-4bits将周报时间从2小时缩短到15分钟

效率提升实测&#xff1a;OpenClaw百川2-13B-4bits将周报时间从2小时缩短到15分钟 1. 为什么我要折腾自动化周报 每周五下午&#xff0c;我的日历上总有一个雷打不动的"周报时间"。这个两小时的"酷刑"包括&#xff1a;翻遍Git提交记录、整理会议纪要碎片…...

Blender 3MF插件完整指南:轻松实现3D打印文件导入导出

Blender 3MF插件完整指南&#xff1a;轻松实现3D打印文件导入导出 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 如果你正在寻找一个能让你在Blender中轻松处理3D打印文…...

Android系统分区详解:从boot到userdata,一篇文章搞懂所有分区的作用与风险

Android系统分区深度解析&#xff1a;从启动原理到安全操作指南 每次按下Android设备的电源键&#xff0c;背后都隐藏着一套精密的分区协作系统。这些看似抽象的分区名称——boot、system、recovery——实则决定着设备的生死存亡。我曾亲眼见证一位开发者误刷boot分区导致设备变…...

注意力机制解析:PETRv2-BEV时空特征融合的可视化研究

注意力机制解析&#xff1a;PETRv2-BEV时空特征融合的可视化研究 1. 当我们说“注意力”时&#xff0c;到底在关注什么 很多人第一次听到“注意力机制”这个词&#xff0c;会下意识联想到人眼聚焦某个物体的动作。这种直觉其实很准确——在PETRv2-BEV这类模型里&#xff0c;“…...

编写程序实现智能乐器音准检测偏差时,提示“需要调音”,新手也能调好音。

1. 实际应用场景描述场景&#xff1a;一名吉他初学者刚刚买回一把新吉他&#xff0c;或者在干燥天气后琴弦音准发生了偏移。他不知道电子调音表如何使用&#xff0c;也不具备绝对音感。本系统功能&#xff1a;用户拨动琴弦&#xff08;例如第 6 弦 E2&#xff09;&#xff0c;电…...

SEO_ 揭秘影响搜索引擎排名的核心因素与算法

SEO核心因素解析&#xff1a;揭秘影响搜索引擎排名的算法 在互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为每一个网站运营者的重要关注点。SEO不仅关系到网站的流量&#xff0c;更直接影响到网站的知名度和商业价值。究竟有哪些核心因素和算法影响着搜…...