当前位置: 首页 > 网络应用技术

同步锁定升级过程

时间:2023-03-06 20:40:50 网络应用技术

  经常使用在多线程中求解线程安全性的问题。与早期同步相比,电流同步已优化。从上一个锁中,它是重量级锁定的优化,到锁定升级的过程(偏置锁 - >轻锁 - > Lightness Lightness Lightnessummary Lock->重量级锁)。

  CAS的全名是Compaare和交换。从名称来看,可以看出在设置之前进行比较。这是一种在多线程环境中实现同步函数的机制。

  以下代码是Reentrantlock类中有关CAS操作的代码部分

  比较范围的参数。

  参数1:当前值

  参数2:期望值

  参数三:需要修改为

  只有当当前值和期望值一致时,当前值才会被修改为三个参数的值。

  CAS广泛用于JUC软件包。例如

  CAS并不难理解,只有一个概念。

  如果您了解对象的内存布局,则可以跳过此段落。该对象的内存布局与JVM的实现以及本章中提到的本章有关。

  创建对象时,其内存中的布局如下,由四个部分组成:

  当您看到上面的图片时,您应该能够看到同步锁定,这实际上是标题中修改后的标记的数据。

  现在有一个Java类T。出来后其对象的内存布局是什么?

  您可以通过小工具在内存中查看该T类的布局

  通过下面的过程打印t对象的布局。

  此图片是无锁定对象的对象布局。

  同步后对象的布局是什么?这次再次修改T型T,目的是让其具有字节填充

  一些小朋友可能在这里有疑问,为什么在这里轻巧的锁,不应该先偏向锁吗?原因如下:

  因为偏置锁在4秒内延迟,因此,如果您想查看效果,则可以将睡眠(4100)添加到Code..或通过JVM参数延迟到0

  在这里阅读它后,我也对MarkWord有所了解,因为在同步中添加锁定是CAS修改的MarkWord中的锁状态。

  上图可能是同步锁后的锁定升级过程。

  上面的重量锁定是关于重量级锁的转换,以申请需要使用的锁。在后来的JDK版本中,锁定不需要应用于OS即可申请锁。可以完成锁定。

  从名称可以看出,偏置锁偏向某个线程,将此锁添加到该线程中。如果当前锁定在找到当前锁定时仅是一个线程,则此锁直接偏向此线程。直接锁定,没有竞争。并在线程堆栈中创建LR(锁定记录)并将标记版复制到LR。同时,锁中标记中的指针还将指向当前持有LR的LR,该指针当前持有锁线

  这里的LR是什么?

  首先,同步是重新输入的锁。当然,这是一个重新锁定的锁。记录次数的数量必须有一件事(必须将锁几次解锁)。解锁时,LR会在堆栈中弹出,并意味着一次解锁一次。

  当有多个线程竞争时,它将升级到轻质锁(旋转锁)

  查看下图。

  当您需要去WC时,只需要去WC。目前,没有其他人需要去WC,因此此时可以使用该WC直接使用它。在门上,这意味着此时大哑巴占据了此WC。

  当有另一个线程抓住锁时,发现当前锁已被占据。目前,锁将从偏置升级到轻质锁。

  匿名的

  执行后,将延迟设置为0到0

  您可以看到此程序的执行结果。当前的锁定状态偏向锁,并且存在有趣的锁,但他没有指向线程的指针。

  这种情况称为匿名偏见。

  当涉及轻质锁时,可能需要在两种情况下说。一个是,在升级到轻质锁之前,有一个偏置锁,另一个是在升级轻量级锁之前没有偏置锁。有两种类型的两种不需要解释。您将了解发生了什么。

  它仍然用于解释上图。目前,当前的WC被Da Du占据。目前,您需要使用WC。此时,Da Da和Er Dian必须抓住WC。

  因为此时锁的状态偏向锁,并且在第二次住宿时必须使用WC(目前,两个人需要同时使用WC,然后将偏置锁升级为轻量级锁),将轻质轻量级升级到轻量级体积,在锁之前,您需要撕下WC上身份的ID(此步骤称为锁定锁),然后两个人可以顺便锁定旋转+cas。当一个线程锁成功时,LR将发布在WC的门上,表明WC目前被线程占据,然后另一个是SpinningHeavyHeavyWeavyWeaveright锁定。

  如果在升级轻质锁之前没有偏置锁,则此时两个线程直接旋转+CAS来抓住锁。

  在了解重量级锁之前,我想我应该说:

  对于系统,可以完成某些事情,无法完成普通应用程序。例如,系统可以杀死硬盘。如果普通程序想杀死硬盘,则必须适用于操作系统。级别后,操作系统级别可以访问所有说明。在用户的状态下,只有可以访问用户可以访问的指令。如果可以执行要访问内核状态的用户状态,则必须应用于操作系统。请致电操作系统。

  在JDK的早期,锁只能在重量级锁定上。因为SO称为JVM实际上是一个以用户态度工作的过程。如果要锁定对象,它必须转到系统才能申请锁定。在应用程序锁定成功之后,有必要将此锁从内核状态返回到用户模式。之所以被称为重量级锁定的原因是,当应用程序锁定时,将用户状态转换为内核状态。

  当锁定锁时,标记字中记录的记录不再是LR的指针,而是C ++ ObjectMonitor,

  如果当前的线程旋转一段时间,则将其升级到重量级锁定而无需抓住锁定,并且当前螺纹存储在入口列表队列中以阻塞它。执行锁定锁的线程后,扣押了入口列表队列中的线程以抓住ITLICK。

  同步的锁定升级过程,

  原始:https://juejin.cn/post/7097910013636640776