黑马JVM总结(三十四)

(1)JMM概述

(2)JMM-原子性-synchronized

java内存模型是如何保证原子性的呢,它是通过synchroized关键字,来达到这个目的的

第一个线程来了进入同步代码块之后,把这个对象加上锁了,线程2来了不能执行,只有等到线程1执行完释放锁之后,线程2才有机会获得锁,保证++ -- 指令作为一个整体来运行的

只有有个synchroized关键字的才会有monitor区

owner:monitor监视器的所有者,同一个时刻只能有一个线程成为owner

EntryList排队等候区

这里呢写法是4条虚拟机指令作为一个整体来进行加锁,比如说循环5w次需要执行5w次的Monitr entry指令和monitor exit指令,是比较耗时的,java虚拟机指令对同一个对象做monitor指令,叫做锁注入,显然不太好

可以这样调整代码:Monitr entry指令和monitor exit指令只执行了一次,不会大批量的执行指令了,减少了加锁解锁的次数

(3)JMM-原子性-问题

他跟局部变量的i++字节码是不一样的局部变量时调用iinc的指令,静态变量需要把静态变量和常数放到操作数栈用iasdd完成自增,他不是在局部变量的曹上直接执行的,它是在操作数栈上执行的,执行完之后呢吧结果存入静态变量

所谓的内存模型呢把整个内存分为了两个部分一部分叫主内存,一部分叫做工作内存,不要跟以前的堆栈混淆,他们是在java内存结构中的说法

静态变量时在主存中的,线程啊是在工作内存中的,主存跟工作内存完成数据的交换,getstatic需要从主存读入工作内存,工作内存完成加法,把结果返回到主存中去

整个操作系统线程模型,它是一种抢先试 ,线程呢会轮流拿到CPU的使用权,cpu会以时间片为单位, 在时间片1交给线程一来运行,时间片2交给线程二来运行

(4)JMM-可见性-问题

(5)JMM-可见性-问题解决

多个线程都由写的操作,即使在变量上加了volatile也没有办法保障它的原子性volatile只适合于一个写线程多个读线程的情况

运行 1秒之后会停下来

相关推荐
月华路2 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
月华路6 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
Shadow(⊙o⊙)7 小时前
C++进阶知识5.0
jvm
一木 之林9 小时前
五、C++新特性、关键字与编译原理
java·jvm·算法
Mr. zhihao10 小时前
线上卡顿排查决策手册:场景 × 命令 × 现象 × 调整方案
java·开发语言·jvm
Nontee13 小时前
Excel 导出组件改造实录:从 Full GC 到声明式导出
jvm·excel
牛油果子哥q13 小时前
C++异常处理万字详解:try-throw-catch机制、栈展开、标准异常体系、自定义异常、工程规范、内存泄漏避坑
开发语言·jvm·c++
leisoo80971 天前
ig50数据落盘ClickHousevsTimescaleDBvsDuckDB实测对比 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
今天的砖头有点烫手啊1 天前
JVM 调优实战:从 GC 日志到参数优化,一次完整排查
java·jvm