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

聊聊jvm中内存模型的坑

jvm线程的内存模型

看图,简单来说线程中操作的变量是副本。在并发情况下,如果数据发生变更,副本的数据就变为脏数据。这个时候就会有并发问题。

参考:https://www.cnblogs.com/yeyang/p/12580682.html

怎么解决并发问题

解决的方案有两种:

1. 加排它锁,将并发的操作变成串行的操作。

2. 无锁方案:通过cas操作,并保证如果变量发生变更,其它的线程需要立即知道。(java的原子操作类使用的就是这种方案:cas+volatile)

volatile关键字实战

先说结论, 从实战效果上看,whlie循环中的变量是无法感知到其它线程对变量的修改的,但是再加上volatile关键字修饰之后可以感知到。而for循环中即使不加关键字volatile修饰,也是可以感知到变化的。这点在写代码时特别要注意。

测试代码如下:

//结论: while循环的写法,可以反应出变量的可见性问题,for循环的写法不能反应可见性问题
public class Demo {static AtomicLong atomicLong = new AtomicLong(0);public static int a = 0;//public volatile static int a = 0;@SneakyThrowspublic static void main(String[] args) {test03();}//while循环在变量不加volatile关键字修饰时,无法感知到变量变化。public static void test02() throws InterruptedException {Thread thread01 = new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {System.out.println("test01:"+a);while (true) {if (a >= 2) {System.out.println("我变了");}}}});thread01.start();Thread thread02 = new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {for(int i=0;i<2;i++){a++;System.out.println("test02:" + a);}}});thread02.start();Thread.sleep(10000);}//for循环即使不加volatile关键字修饰,也可以感知到变量变化。public static void test03() throws InterruptedException {Thread thread01 = new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {System.out.println("test01:"+a);for(int i=0; i<10000; i++){if (i==0) {Thread.sleep(1000);}if (a >= 2) {System.out.println("我变了");}}}});thread01.start();Thread thread02 = new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {for(int i=0;i<2;i++){a++;System.out.println("test02:" + a);}}});thread02.start();Thread.sleep(10000);}
}

相关文章:

聊聊jvm中内存模型的坑

jvm线程的内存模型 看图&#xff0c;简单来说线程中操作的变量是副本。在并发情况下&#xff0c;如果数据发生变更&#xff0c;副本的数据就变为脏数据。这个时候就会有并发问题。 参考&#xff1a;https://www.cnblogs.com/yeyang/p/12580682.html 怎么解决并发问题 解决的…...

DevOps已死?2024年的DevOps将如何发展

随着我们进入2024年&#xff0c;DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示&#xff0c;未来五年&#xff0c;支持DevOps实践的产品市场继续保持健康且快速增长&#xff0c;2022年-2027年的复合年增长率&#xff0…...

appium控制手机一直从下往上滑动

用于使用Appium和Selenium WebDriver在Android设备上滚动设置应用程序的界面。具体来说&#xff0c;它通过WebDriverWait和expected_conditions等待元素出现&#xff0c;然后使用ActionChains移动到该元素并执行滚动动作。在setUp中&#xff0c;它初始化了Appium的WebDriver和c…...

为什么光伏探勘测绘需要无人机?

随着全球对可再生能源需求的不断增长&#xff0c;光伏产业也迎来了快速发展的机遇。光伏电站作为太阳能发电的主要形式之一&#xff0c;其建设前期的探勘测绘工作至关重要。在这一过程中&#xff0c;无人机技术的应用正逐渐展现出其独特的优势。那么&#xff0c;为什么光伏探勘…...

day10 | 栈与队列 part-2 (Go) | 20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值

今日任务 20 有效的括号 (题目: . - 力扣&#xff08;LeetCode&#xff09;)1047 删除字符串中的所有相邻重复项 (题目: . - 力扣&#xff08;LeetCode&#xff09;)150 逆波兰表达式求值 (题目: . - 力扣&#xff08;LeetCode&#xff09;) 20 有效的括号 题目: . - 力扣&…...

深入解析Tomcat的工作流程

tomcat解析 Tomcat是一个广泛使用的开源Servlet容器&#xff0c;用于托管Java Web应用程序。理解Tomcat的工作流程对于开发人员和系统管理员来说是非常重要的。本文将深入探讨Tomcat的工作原理&#xff0c;包括请求处理、线程池管理、类加载、以及与Web服务器之间的通信。 ###…...

【web网页制作】html+css旅游家乡山西主题网页制作(3页面)【附源码】

山西旅游网页目录 涉及知识写在前面一、网页主题二、网页效果Page1、景点介绍Page2、酒店精选|出行攻略Page3、景色欣赏 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 山西旅游主题网页制作&am…...

系统参数指标:QPS、TPS、PV、UV等

QPS QPS&#xff1a;Queries Per Second 是每秒查询率&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准&#xff0c;即每秒的响应请求数&#xff0c;也即是最大吞吐能力。 TPS TPS&#xff1a;Tra…...

一入鸿蒙深似海,从此Spring是路人:鸿蒙开发面试题

详细内容请参考最新的官方鸿蒙文档&#xff0c;不保证时效性 写得不对的地方请多多指点&#xff0c;本文仅代表个人所学知识范围 联系方式QQ 1219723557&#xff0c;可一同交流学习 欢迎补充&#xff0c;希望能做一个汇总版本出来 1. 网络编程基本知识&#xff08;较为简单&…...

【Python】使用OPC UA创建数据服务器

目录 准备工作服务器设置创建或获取节点设置节点值启动服务器查看服务器客户端总结 在工业自动化和物联网&#xff08;IoT&#xff09;领域&#xff0c;OPC UA&#xff08;开放平台通信统一架构&#xff09;已经成为一种广泛采用的数据交换标准。它提供了一种安全、可靠且独立于…...

JavaScript(六)-高级篇

文章目录 作用域局部作用域全局作用域作用域链JS垃圾回收机制闭包变量提升 函数进阶函数提升函数参数动态参数多余参数 箭头函数 解构赋值数组解构对象解构 遍历数组forEach方法&#xff08;重点&#xff09;构造函数深入对象创建对象的三种方式构造函数实例成员 & 静态成员…...

速盾:游戏cdn什么意思

CDN&#xff08;Content Delivery Network&#xff09;是指内容分发网络&#xff0c;它是由一组位于世界各地的服务器组成的网络&#xff0c;用于将内容有效地传输给用户。游戏CDN&#xff0c;顾名思义&#xff0c;就是用于游戏内容分发的网络。 在传统的网络传输模式中&#…...

数据库-Redis(11)

目录 51.什么是Redis事务? 52.Redis事务相关命令? 53.Redis事务的三个阶段?...

【网安小白成长之路】6.pikachu、sql-labs、upload-labs靶场搭建

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…...

(七)C++自制植物大战僵尸游戏关卡数据加载代码讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 打开LevelData.h和LevelData.cpp文件。文件位置如下图所示。 LevelData.h 此头文件中定义了两个类&#xff0c;分别是OpenLevelData、LevelData&#xff0c;其中OpenLevelData用于加载文件数据。LevelData解析数据…...

wpf下RTSP|RTMP播放器两种渲染模式实现

技术背景 在这篇blog之前&#xff0c;我提到了wpf下播放RTMP和RTSP渲染的两种方式&#xff0c;一种是通过控件模式&#xff0c;另外一种是直接原生RTSP、RTMP播放模块&#xff0c;回调rgb&#xff0c;然后在wpf下渲染&#xff0c;本文就两种方式做个说明。 技术实现 以大牛直…...

Element-UI 自定义-下拉框选择年份

1.实现效果 场景表达&#xff1a; 默认展示当年的年份&#xff0c;默认展示前7年的年份 2.实现思路 创建一个新的Vue组件。 使用<select>元素和v-for指令来渲染年份下拉列表。 使用v-model来绑定选中的年份值。 3.实现代码展示 <template><div><el-…...

二叉树的链式存储

二叉树是一种非常重要的数据结构&#xff0c;它能够高效地进行数据的插入、删除和查找操作。二叉树的每个节点最多有两个子节点&#xff0c;分别是左子节点和右子节点。二叉树可以采用多种不同的存储方式来实现&#xff0c;其中链式存储是最为直观和常用的一种方法。本文将深入…...

[计算机效率] 鼠标手势工具:WGestures(解放键盘的超级效率工具)

3.22 鼠标手势工具&#xff1a;WGestures 通过设置各种鼠标手势和操作进行绑定。当用户通过鼠标绘制出特定的鼠标手势后就会触发已经设置好的操作。有点像浏览器中的鼠标手势&#xff0c;通过鼠标手势操纵浏览器做一些特定的动作。这是一款强大的鼠标手势工具&#xff0c;可以…...

Linux useradd命令教程:如何创建新的用户账户(附实例详解和注意事项)

Linux useradd命令介绍 useradd是Linux中用于添加用户账户的命令。它可以用于创建新的用户&#xff0c;并可以配合不同的选项来指定用户的主目录、UID、GID、组等信息。 Linux useradd命令适用的Linux版本 useradd命令在大多数Linux发行版中都可以使用&#xff0c;包括但不限…...

基于ollama搭建本地chatGPT

ollama帮助我们可以快速在本地运行一个大模型&#xff0c;再整合一个可视化页面就能构建一个chatGPT&#xff0c;可视化页面我选择了chat-ollama&#xff08;因为它还能支持知识库&#xff0c;可玩性更高&#xff09;&#xff0c;如果只是为了聊天更推荐chatbox 部署步骤 下载…...

C++11 数据结构3 线性表的循环链式存储,实现,测试

上一节课&#xff0c;我们学了线性表 单向存储结构&#xff08;也就是单链表&#xff09;&#xff0c;这个是企业常用的技术&#xff0c;且是后面各种的基本&#xff0c;一定要牢牢掌握&#xff0c;如果没有掌握&#xff0c;下面的课程会云里雾里。 一 &#xff0c;循环链表 1…...

初识DOM

目录 前言: 1.初识DOM: 1.1DOM树: 1.2节点&#xff08;Node&#xff09;: 1.2.1元素节点&#xff1a; 1.2.2属性节点&#xff1a; 1.2.3文本节点&#xff1a; 1.3Document对象: 2.操作网页元素: 2.1找出元素&#xff1a; 2.1.1document.getElementById(id)&#xff1…...

计算机视觉实验五——图像分割

计算机视觉实验五——图像分割 一、实验目标二、实验内容1.了解图割操作&#xff0c;实现用户交互式分割&#xff0c;通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域&#xff0c;实现分割①图片准备②代码③运行结果④代码说明 2.采用聚类法实现…...

移动Web学习06-移动端适配Less预处理器项目案例

项目目标&#xff1a;实现在不同宽度设备中等比缩放的网页效果 Less代码 import ./base; import ./normalize;// 变量: 存储37.5 rootSize: 37.5rem; *{margin: 0;padding: 0; } body {background-color: #F0F0F0; }// 主体内容 .main {// padding-bottom: (50 / 37.5rem);pa…...

LangChain-25 ReAct 让大模型自己思考和决策下一步 AutoGPT实现途径、AGI重要里程碑

背景介绍 大模型ReAct&#xff08;Reasoning and Acting&#xff09;是一种新兴的技术框架&#xff0c;旨在通过逻辑推理和行动序列的构建&#xff0c;使大型语言模型&#xff08;LLM&#xff09;能够达成特定的目标。这一框架的核心思想是赋予机器模型类似人类的推理和行动能…...

24/04/15总结

多线程&#xff1a; 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位 并发:在同一时刻&#xff0c;有多个指令在单个cpu上交替执行 并行:在同一时刻&#xff0c;有多个指令在多个cpu上同时执行 多线程的实现方式 1.继承…...

vue3、vue2中nextTick源码解析

nexttick是啥 nextTick是Vue提供的一个全局API&#xff0c;由于Vue的异步更新策略导致我们对数据的修改不会更新&#xff0c;如果此时想要获取更新后的Dom&#xff0c;就需要使用这个方法. vue的异步更新策略意思是如果数据变化,vue不会立刻更新dom,而是开启一个队列,把组件更…...

【氮化镓】GaN HEMTs结温和热阻测试方法

文章《Temperature rise detection in GaN high-electron-mobility transistors via gate-drain Schottky junction forward-conduction voltages》&#xff0c;由Xiujuan Huang, Chunsheng Guo, Qian Wen, Shiwei Feng, 和 Yamin Zhang撰写&#xff0c;发表在《Microelectroni…...

c++11 标准模板(STL)本地化库 - 平面类别(std::codecvt) - 在字符编码间转换,包括 UTF-8、UTF-16、UTF-32 (四)

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 在字符编码间转换&#xff0c;包括 UTF-8、UTF-16、UTF-32 std::…...

海珠一站式网站建设/seo深度解析

韩立刚老师教学视频笔记 图片源自韩立刚老师的教学视频以及谢希仁PPT&#xff0c;侵删 计算机网络基础&#xff08;韩立刚视频笔记&#xff09;第一章 概述 第一章&#xff08;概述&#xff09; 局域网广域网OSI参考模型OSI架构图各层间的数据传输网络排错OSI网络参考模型和网…...

南海网站建设报价/百度首页百度

安装了好几次了&#xff0c;但是还是没记住&#xff0c;就像技能一样&#xff0c;不常用就会忘记&#xff0c;hiahia~这里记录一下我这有之前下好的&#xff0c;就不拿新的了~运行文件&#xff0c;然后就是对话框&#xff0c;一路 next &#xff0c;这里要勾选对话框才能next选…...

云南5个中风险地区/汕头自动seo

Camtasia 9 录制屏幕软件&#xff0c;并且有丰富的专业剪辑功能. 转载于:https://www.cnblogs.com/langhaoabcd/p/10446132.html...

花店网站建设毕设介绍/电子商务平台

2009年&#xff0c;华晨汽车在德国的Euro NCAP标准碰撞测试中成绩糟糕&#xff0c;成为当年中国汽车业的典型事件。“碰撞门”后的沈阳华晨金杯汽车正视问题&#xff0c;对自主品牌遇到这种挫折&#xff0c;抑或是一种壁垒&#xff0c;但公司承认与和世界发达国家的一些企业有很…...

上海公司法人落户条件/廊坊网站seo

Java优先级 Java提供一个线程调度器来监视和控制Runnable状态的线程。线程的调度策略采用抢占式&#xff0c;优先级高的线程比优先级低的线程优先执行。在优先级相同的情况下&#xff0c;按照“先到先服务”的原则。 每个Java程序都有一个默认的主线程&#xff0c;就是通过JV…...

网站开发协议/宣传软文模板

一新建用户 ----------- 二首先修改权限必须在电脑cmd 中运行 开设的权限 主要就是 1 所有库的 *.* 2 所有的表 db.* 3所有的字段db.t1 4 很对一个字段 1开启第一个cmd 利用root 用户名 增加用户的权限 实例select 增加的用户 只能查 不能修改 2 开…...