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

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

 

http://www.lryc.cn/news/195729.html

相关文章:

  • [linux]vncserver常用终端命令合集
  • 亚马逊、eBay,速卖通,国际站买家账号支付异常问题解决方法
  • Constitutional AI
  • TDengine 资深研发整理:基于 SpringBoot 多语言实现 API 返回消息国际化
  • 数据结构-冒泡排序Java实现
  • 完整教程:Java+Vue+Websocket实现OSS文件上传进度条功能
  • 【微服务 SpringCloud】实用篇 · 服务拆分和远程调用
  • Linux 下I/O操作
  • C#内映射lua表
  • android studio检测不到真机
  • 【Eclipse】设置自动提示
  • 单片机TDL的功能、应用与技术特点 | 百能云芯
  • 解决笔记本无线网络5G比2.4还慢的奇怪问题
  • GitHub Action 通过SSH 自动部署到云服务器上
  • 【AOP系列】7.数据校验
  • 黑马JVM总结(三十七)
  • 企业如何通过媒体宣传扩大自身影响力
  • 处理vue直接引入图片地址时显示不出来的问题 src=“[object Module]“
  • vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
  • java正则表达式 及应用场景爬虫,捕获分组非捕获分组
  • 基于 Debian 稳定分支发行版的Zephix 7 发布
  • MBR20100CT-ASEMI肖特基MBR20100CT参数、规格、尺寸
  • 修炼k8s+flink+hdfs+dlink(五:安装dockers,cri-docker,harbor仓库)
  • github: kex_exchange_identification: Connection closed by remote host
  • AWS香港Web3方案日,防御云安全实践案例受关注
  • QT 集成MQTT过程
  • GeoServer改造Springboot启动五(解决接口返回xml而不是json)
  • 在unity中给游戏物体一个标记
  • 【黑马程序员】机器学习
  • flutter card 使用示例