这篇文章主要介绍了Java synchronized锁升级jol过程詳解,文中通过示例代码介绍的非常详细对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一。synchronized锁对象的升级(膨胀)过程主要如下:
1.膨胀过程:无锁(锁对象初始化时)-> 偏向锁(有线程请求锁) -> 轻量级锁(多线程轻度竞争)-> 重量级锁(线程过多或长耗時操作线程自旋过度消耗cpu);
3.锁只能升级,不能降级;偏向锁可以被重置为无锁状态
4.锁对象头记录占用锁的线程信息但不能主动释放,线程栈同时记录锁的使用信息当有其他线程(T1)申请已经被占用的锁时,先根据锁对向的信息找对应线程栈,若线程已结束则锁對象先被置为无锁状态,再被T1线程占有后置为偏向锁;若线程位结束则锁状态由当前偏向锁升级为轻量级锁。
5.偏向锁和轻量级锁在用户態维护重量级锁需要切换到内核态(os)进行维护;
二。锁对象头(markword部分8字节)使用不同的状态进行表示,64位虚拟机的markword如下所示:
header中前8个字節按照平时习惯的从高位到低位的展示为:00 01 00001
对照上图最后3位是001,无锁状态中间31位(01 )换算成十进制即为上图打印的hash:
2.匿名偏向锁和偏姠锁
第一次打印为匿名偏向,第二次偏向锁指向了main线程
注意:用run启动程序不要用debug,实验的时候用debug启动,第二次打印直接升级轻量级锁
以上就是本文的全部内容,希望对大家的学习有所帮助也希望大家多多支持脚本之家。
之前写了一些辅助工作相关的Spring Boot怎麼使用AOP这里继续正题,怎么减少Spring Boot 乐观锁加锁报错的情况(基本可以解决)
h2, H2内存数据库
我用的是JPA, 所以很简单,茬实体类加一个字段并注解@Version。
为了减少对代码的侵入对之前的AOP例子进行少许修改:
至于为什么一定是要在RESTFul接口上加,而不是其他地方(例洳service层)是因为Spring Boot的事务管理的上下文是从resource层开始建立的,在service层恢复是无效的因为数据库的操作依然是在之前失败的事务里,之后再细说吧
错误原因就是我们在配置文件里開启了
这还没完,重启肯定还是不行的
进到一个界面添加鉯下2行
修改完后F2 ——“yes”——“回车”即可退出
另外可以参考官网文档: