首页 > 编程知识 正文

多线程数据库锁,java锁升级机制

时间:2023-05-04 05:08:05 阅读:39994 作者:1257

多线程锁定状态图

锁定升级的过程(接下来将介绍) )

上一篇文章介绍的对象的内存布局描述了标记word

统一解释:偏转锁定位和锁定标志位用于区分是哪个锁定状态

另一方面,未锁定的状态是new刚提交对象,没有线程必须使用此对象。 此时,对象的markword对象的前8字节中记录的锁定信息如下图所示。

二.偏转锁定的第一个线程使用此对象时,将对象的标记word对象标头切换到偏转锁定状态。 其中最重要的红色标记字段记录了当前线程的指针,如下图所示,表示当前对象仅偏向于当前线程锁定。

三、轻量级锁定当任一线程开始与此资源冲突时,锁定将升级为轻量级锁定,对象标头的标记word也将切换,从而为每个线程在线程堆栈中创建新的LockRecord对象这里的CAS:记录当前值、计算结果值、比较当前值和最新当前值(如果对象指向某个线程的线程中的锁定记录,其他线程将旋转)

下图显示了旋转从多轻的锁定变为多重的锁定

四.由于重锁(内核状态)线程持续旋转,占用CPU资源,进一步升级为重锁。 在重锁下有一个队列,这些原始旋转的锁将进入队列。队列无序,synchronize非公平锁

接下来,我将介绍一些简单的概念。 解锁,锁定粗化五,锁定解除

StringBuffer是线程安全的,所有方法都由同步限定。 名为sb的引用仅用于add方法,而不是其他线程引用。 (因为局部变量、栈私有)、无法共享的资源和JVM将自动解除内部锁定

六、锁粗化! 在此插入图像说明3359 img-blog.csdn img.cn/2021041616014793.png

StringBuffer是线程安全的,关键方法append用synchronize限定,如果没有解锁,则需要对上述程序进行100次解锁,这意味着锁定范围位于一系列操作的外部(这里是while

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。