黑马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秒之后会停下来

相关推荐
秋夫人11 小时前
jvm G1 垃圾收集日志分析示例(GC)
jvm
天天向上杰11 小时前
简识JVM的栈帧优化共享技术
java·jvm
讓丄帝愛伱14 小时前
不重启JVM,替换掉已经加载的类
jvm
qq_3127384514 小时前
jvm学习总结
jvm·学习
天天向上杰14 小时前
简识JVM栈中的程序计数器
jvm
大乔乔布斯14 小时前
JRE、JVM 和 JDK 的区别
java·开发语言·jvm
天天向上杰15 小时前
简识JVM栈帧中的局部变量表
jvm
小白的一叶扁舟1 天前
深入剖析 JVM 内存模型
java·jvm·spring boot·架构
小池先生1 天前
jvm_threads_live_threads 和 jvm_threads_states_threads 这两个指标之间存在一定的关系,但它们关注的维度不同
jvm
{⌐■_■}2 天前
【GORM】事务,嵌套事务,保存点事务的使用,简单电商平台go案例
开发语言·jvm·后端·mysql·golang