【高并发】别闹了,这样理解Java的内存模型才正确(八种操作+同步规则)
大家好,我是冰河~~
最近冰河不是又出版了一本《深入理解高并发编程:核心原理与案例实战》一书吗?很多小伙伴对于Java的内存模型还是不太了解,今天,我就用最简短的篇幅结合八种操作和同步规则给大家介绍下到底什么是Java的内存模型。
同步八种操作
(1)lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态;
(2)unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定;
(3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便后续的load动作使用;
(4)load(载入):作用于主内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中;
(5)use(使用):作用于工作内存的变量,把工作内存中的一个变量传递给执行引擎;
(6)assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量;
(7)store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write操作;
(8)write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。
同步规则
(1)如果要把一个变量从主内存中复制到工作内存,就需要按顺序的执行read和load操作,如果把变量从工作内存中同步回主内存中,就要按顺序的执行store和write操作。但Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行;
(2)不允许read和load、store和write操作之一单独出现;
(3)不允许一个线程丢弃它的最近assign的操作,即变量在工作内存中改变了之后必须同步到主内存中;
(4)不允许一个线程无原因的(没有发生过任何assign操作)把数据从工作内存同步回主内存;
(5)一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量。即就是对一个变量实施use和store操作之前,必须先执行过了assign和load操作。
(6)一个变量在同一时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次,多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁。lock和unlock必须成对出现;
(7)如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值;
(8)如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许unlock一个被其他线程锁定的变量;
(9)对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作)。
好了,今天就到这儿吧,我是冰河,我们下期见~~
写在最后
如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~
推荐阅读:
- 《实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!》
- 《从零到上亿用户,我是如何一步步优化MySQL数据库的?(建议收藏)》
- 《我用多线程进一步优化了亿级流量电商业务下的海量数据校对系统,性能再次提升了200%!!(全程干货,建议收藏)》
- 《我用多线程优化了亿级流量电商业务下的海量数据校对系统,性能直接提升了200%!!(全程干货,建议收藏)》
- 《我用10张图总结出了这份并发编程最佳学习路线!!(建议收藏)》
- 《高并发场景下一种比读写锁更快的锁,看完我彻底折服了!!(建议收藏)》
- 《全网最全性能优化总结!!(冰河吐血整理,建议收藏)》
- 《三天撸完了MyBatis,各位随便问!!(冰河吐血整理,建议收藏)》
- 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)》
- 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些核心技能是你必须要掌握的!完整学习路线!!(建议收藏)》
- 《奉劝那些刚参加工作的学弟学妹们:这些计算机与操作系统基础知识越早知道越好!万字长文太顶了!!(建议收藏)》
- 《我用三天时间开发了一款老少皆宜的国民级游戏,支持播放音乐,现开放完整源代码和注释(建议收藏)!!》
- 《我是全网最硬核的高并发编程作者,CSDN最值得关注的博主,大家同意吗?(建议收藏)》
- 《毕业五年,从月薪3000到年薪百万,我掌握了哪些核心技能?(建议收藏)》
- 《我入侵了隔壁妹子的Wifi,发现。。。(全程实战干货,建议收藏)》
- 《千万不要轻易尝试“熊猫烧香”,这不,我后悔了!》
- 《清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!》
- 《7.3万字肝爆Java8新特性,我不信你能看完!(建议收藏)》
- 《在业务高峰期拔掉服务器电源是一种怎样的体验?》
- 《全网最全Linux命令总结!!(史上最全,建议收藏)》
- 《用Python写了个工具,完美破解了MySQL!!(建议收藏)》
- 《SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)》
- 《MySQL 8中新增的这三大索引,直接让MySQL起飞了,你竟然还不知道!!(建议收藏)》
- 《撸完Spring源码,我开源了这个分布式缓存框架!!(建议收藏)》
- 《亿级流量高并发秒杀系统商品“超卖”了,只因使用的JDK同步容器中存在这两个巨大的坑!!(踩坑实录,建议收藏)》
- 《奉劝那些刚参加工作的学弟学妹们:要想学好并发编程,这些并发容器的坑是你必须要注意的!!(建议收藏)》
- 《公司的报表工具太难用,我三天撸了个Excel工具,运营小姐姐直呼太好用了,现已开源!!(建议收藏)》
- 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程核心技能是你必须要掌握的!!(建议收藏)》
- 《阿里面试官:高并发大流量秒杀系统如何正确的解决库存超卖问题?(建议收藏)》
- 《Redis五大数据类型与使用场景汇总!!(含完整实战案例,建议收藏)》
好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,我是冰河,我们下期见~~
【高并发】别闹了,这样理解Java的内存模型才正确(八种操作+同步规则)相关推荐
- 聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁
这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁.这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现.可重入锁的特点是: 1. 是互 ...
- 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一)
AQS是AbstractQueuedSynchronizer的缩写,AQS是Java并包里大部分同步器的基础构件,利用AQS可以很方便的创建锁和同步器.它封装了一个状态,提供了一系列的获取和释放操作, ...
- 掌握Java的内存模型,你就是解决并发问题最靓的仔
摘要:如果编写的并发程序出现问题时,很难通过调试来解决相应的问题,此时,需要一行行的检查代码,这个时候,如果充分理解并掌握了Java的内存模型,你就能够很快分析并定位出问题所在. 本文分享自华为云社区 ...
- 【转】深入理解JVM—JVM内存模型
原文链接 http://www.cnblogs.com/dingyingsi/p/3760447.html#top 深入理解JVM-JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是 ...
- 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则
在前几篇将Java内存模型的那些事基本上把这个域底层的概念都解释清楚了,聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障 这篇分析了在X86平台下,volatile,synchronize ...
- Java高并发编程(二):Java并发机制的底层实现机制
Java代码在编译后会变成Java字节码,字节码在之后被类加载机制加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. ...
- 聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类
这篇说说java.util.concurrent.atomic包里的类,总共12个,网上有很多文章解析这几个类,这里挑些重点说说. 这12个类可以分为三组: 1. 普通类型的原子变量 2. 数组类型的 ...
- java交易撮合怎么实现_「康力电梯002367」“股票实时交易系统如何实现高并发撮合交易?最好有java架构“java 股票分析工具-京东方a小-seo金融...
本文由京东方a小编创作于2020-09-10 21:11:04发布的来源于seo金融股票配资http://www.drill-pipe.com/gov/52833.html请您欣赏.seo金融网拥有众 ...
- Java高并发编程学习(三)java.util.concurrent包
简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...
最新文章
- (转)对微软那棵TreeView进行试用,主要是对CheckBox进行操作
- 从Git存储库中删除文件而不从本地文件系统中删除它
- django mysql开发_【python-Django开发】Django 配置MySQL数据库讲解!!!
- 没错,接单就是特简单!
- Vuejs报错error: Unexpected console statement (no-console) at src\... 解决办法
- python 从excel中抓取数据_使用Python抓取美团数据存于Excel中
- 【小技巧】桌面图标出现蓝色问号的怎么办?
- java 复制字段_java - 在构造函数中按字段复制字段 - 我需要一个更简洁的形式 - SO中文参考 - www.soinside.com...
- 再见了,余!额!宝!!!
- 学Mysql怎样快速入门?
- java字典序列化_在Python中解析序列化Java对象
- Android移动开发基础案例教程 第2章 Android UI开发
- from collections import Counter计数器
- citespace:Your version‘s status cannot be verified due to network issue. Check your network conne
- 一,SpringBoot——安装spring boot CLI
- CUDA内联汇编和PTX ISA入门指南
- Android移动开发问题 AAPT: error: resource xml/11 (aka com.example.myapplication:xml/11) not found.
- echarts cpu监控 心跳/心电图
- 哪个免费查重系统会更靠谱呢?
- 【php】分享一个php转换微信、QQ、微博 特殊非主流 | 杀马特 网名的 function