加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

说说Java 的几把 JVM 级锁

发布时间:2022-06-04 08:42:41 所属栏目:安全 来源:互联网
导读:在计算机行业有一个定律叫摩尔定律,在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜,cpu从单核到了多核,缓存性能也得到了很大提升,尤其是多核cpu技术的到来,计算机同一时刻可以处理多个任务。在硬件层面的发展带来的效率极大提升中,软件
         在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜,cpu从单核到了多核,缓存性能也得到了很大提升,尤其是多核cpu技术的到来,计算机同一时刻可以处理多个任务。在硬件层面的发展带来的效率极大提升中,软件层面的多线程编程已经成为必然趋势,然而多线程编程就会引入数据安全性问题,有矛必有盾,于是发明了“锁”来解决线程安全问题。在这篇文章中,总结了java中几把经典的JVM级别的锁。
 
         a、有锁升级过程 在jdk1.5(含)之前,synchronized的底层实现是重量级的,所以之前一直称呼它为"重量级锁",在jdk1.5之后,对synchronized进行了各种优化,它变得不那么重了,实现原理就是锁升级的过程。我们先聊聊1.5之后的synchronized实现原理是怎样的。说到synchronized加锁原理,就不得不先说java对象在内存中的布局,java对象内存布局如下:
 
         对象自身的运行时数据(MarkWord)
         存储hashCode、GC分代年龄、锁类型标记、偏向锁线程ID、CAS锁指向线程LockRecord的指针等,synconized锁的机制与这个部分(markwork)密切相关,用markword中最低的三位代表锁的状态,其中一位是偏向锁位,另外两位是普通锁位
 
         对象类型指针(Class Pointer)
         对象指向它的类元数据的指针、JVM就是通过它来确定是哪个Class的实例(2)实例数据区域 此处存储的是对象真正有效的信息,比如对象中所有字段的内容
          
         对齐填充区域 JVM的实现HostSpot规定对象的起始地址必须是8字节的整数倍,换句话来说,现在64位的OS往外读取数据的时候一次性读取64bit整数倍的数据,也就是8个字节,所以HotSpot为了高效读取对象,就做了"对齐",如果一个对象实际占的内存大小不是8byte的整数倍时,就"补位"到8byte的整数倍。所以对齐填充区域的大小不是固定的。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!