栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

偶然听说:追风少年他奶奶今天晚上二婚,而我还在玩JVM

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

偶然听说:追风少年他奶奶今天晚上二婚,而我还在玩JVM

写在前面的话:    

时间:2021.12.31--2022元旦前一夜

地点:陕西西安(居家办公)

特别强调:手残党无法给自己做肉吃

人物:冷妆,刚入行的java小菜鸡

事件起因:在哪吒社区得到《亿级流量java高并发与网络编程实战》

事件经过:西安因为疫情居家办公,而我的电脑落在办公区域,大型社4现场

续前文:分布式Id生成器之雪花算法

引入正题之高并发JVM

对了,上面在同步机制解决方案中还提及到了死锁的产生与避免死锁的方案 


JVM jvm概述

     全称是java虚拟机,java源文件通过编译器生成.class的字节码文件,字节码文件通过jvm生成机器码,机器码与操作系统交互,正是因为这样,保证了java语言的可移植性高,官方有”write one,run anywhere“的说法,从java的角度来看看JVM的位置

 jvm内存区域

jvm的内存区域从线程共享分为堆区和方法区(常量池),从线程私有分为本地方法栈,虚拟机栈,程序计数器

JMM(java memory model)java内存模型 

定义程序中变量(线程共享)的访问规则,分为主内存和工作内存【可以从线程私有和线程共享去理解,参考下图】

另外来说主要的一点就是线程在运行期间必须遵循的规定

  1. 只能访问自己工作内存中的变量
  2. 无法直接访问其他线程工作内存中的变量
  3. 可以通过主内存,间接访问其他线程的工作内存中变量

总结来说就是主内存和工作线程的访问问题,解决策略如下

实际上,不同线程之间在进行数据交互时,要完成经历如下8个步骤 

ps:有图有真相 

 但这里需要注意的是JVM对long、double64位的误操作,所以引入了volatile关键字


Volatile解决可见性与重排序问题 1.原子性

某一条语句不可再拆分

上图框中的展示的juc包,箭头所指的是atomic下的所有类

上图测试的atomic原子性的结果

 上图根据源码可知,atomic实现了CAS算法,保证变量的原子性操作

2.可见性

某一个线程对volatile修饰的变量进行的任何操作,都会第一时间同步到其他线程中

3.重排序(不会影响单线程程序执行结果)

某条语句内部的多个指令的执行顺序

通过对象的实例化可以理解重排序

双重检测机制下的饿汉单例模式理解指令重排

ps:volatile通过”内存屏障“实现防止指令重排 

4.volatile非线程安全

上图通过测试结果可知,volatile非线程安全 

 通过运行编译的class文件可知,白框中展示num++不是原子性操作

写在后面的话:

事件结果:现在的时间完全按照自己的规划走下去,所以写下了以上blog

碎碎念:欢迎大家指出blog中的问题,督促笔者进一步改善,你的建议是笔者坚持的动力

最后:今天是跨年夜,记得观看习大大的新年贺词                                        总结:人丑就得多看书

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/686056.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号