多线程锁定状态图
锁定升级的过程(接下来将介绍) )
上一篇文章介绍的对象的内存布局描述了标记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