首页 > 其他分享 >锁撤销阈值达到20次批量重偏向是针对类还是线程?撤销阈值达到20次触发的20是指撤销偏向锁20次后触发还是19次后触发?

锁撤销阈值达到20次批量重偏向是针对类还是线程?撤销阈值达到20次触发的20是指撤销偏向锁20次后触发还是19次后触发?

时间:2024-08-03 21:53:19浏览次数:11  
标签:触发 20 t2 t3 t1 new 次后 偏向

先说答案, 锁的批量重偏向是针对类的,且只能触发一次,撤销阈值20次是指撤销19个对象偏向锁后再来一个对象需要撤销才会触发锁的批量重偏向,实际会撤销19个。

测试过程如下:

建立spring项目,要有依赖

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.16</version> 
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

 测试一

package com.itheima.mybatis;

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

import java.util.Vector;
import java.util.concurrent.locks.LockSupport;

/**
 * @author 名
 * @date 2024/8/2-18:44
 */
@Slf4j
public class Test4 {
    public static void main(String[] args) throws InterruptedException {
        Test4.test4();
    }

    static Thread t1, t2, t3;

    private static void test4() throws InterruptedException {
        Vector<Dog> list = new Vector<>();
        int loopNumber = 60 ;
        t1 = new Thread(() -> {
            for (int i = 0; i < loopNumber; i++) {
                Dog d = new Dog();
                list.add(d);
                synchronized (d) {
                    log.debug(i+1 + "号" + ClassLayout.parseInstance(d).toPrintable());
                }
            }
            LockSupport.unpark(t2);
        }, "t1");
        t1.start();
        t2 = new Thread(() -> {
            LockSupport.park();
            log.debug("===============> ");
            for (int i = 0; i < loopNumber; i++) {
                Dog d = list.get(i);
                synchronized (d) {
                    log.debug(i+1 + "号" + ClassLayout.parseInstance(d).toPrintable());
                }
            }
            LockSupport.unpark(t3);
        }, "t2");
        t2.start();
        t3 = new Thread(() -> {
            LockSupport.park();
            log.debug("===============> ");
            for (int i = 0; i < loopNumber; i++) {
                Dog d = list.get(i);
                synchronized (d) {
                    log.debug(i+1 + "号" + ClassLayout.parseInstance(d).toPrintable());
                }
            }
        }, "t3");
        t3.start();


    }

}
class Dog{}

线程t1建立60个对象,并让60个对象加锁(偏向锁偏向t1),线程t2,t3分别对60个对象加锁,多线程执行顺序为t1->t2->t3。

测式结果:

可以看到结果,t2撤销19个偏向锁后(1号至19号),第20次触发批量重偏向,而t3在第20次没有触发批量重偏向,说明撤销阈值20是针对类的不是针对线程的,且只能触发一次。

测是二:

package com.itheima.mybatis;

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

import java.util.Vector;
import java.util.concurrent.locks.LockSupport;

/**
 * @author 名
 * @date 2024/8/2-18:44
 */
@Slf4j
public class Test4 {
    public static void main(String[] args) throws InterruptedException {
        Test4.test4();
    }

    static Thread t1, t2, t3;

    private static void test4() throws InterruptedException {
        Vector<Dog> list = new Vector<>();
        int loopNumber = 29 ;
        t1 = new Thread(() -> {
            for (int i = 0; i < loopNumber; i++) {
                Dog d = new Dog();
                list.add(d);
                synchronized (d) {
                    log.debug(i+1 + "号" + ClassLayout.parseInstance(d).toPrintable());
                }
            }
            LockSupport.unpark(t2);
        }, "t1");
        t1.start();
        t2 = new Thread(() -> {
            LockSupport.park();
            log.debug("===============> ");
            for (int i = 0; i < loopNumber-10; i++) {
                Dog d = list.get(i);
                synchronized (d) {
                    log.debug(i+1 + "号" + ClassLayout.parseInstance(d).toPrintable());
                }
            }
            LockSupport.unpark(t3);
        }, "t2");
        t2.start();
        t3 = new Thread(() -> {
            LockSupport.park();
            log.debug("===============> ");
            for (int i = 0; i < loopNumber; i++) {
                Dog d = list.get(i);
                synchronized (d) {
                    log.debug(i+1 + "号" + ClassLayout.parseInstance(d).toPrintable());
                }
            }
        }, "t3");
        t3.start();


    }

}
class Dog{}

修改数值,线程t1建立29个对象,并让29个对象加锁(偏向锁偏向t1),线程t2对前19个对象加锁,t3对29个对象加锁,多线程执行顺序为t1->t2->t3。

可以看到线程t2撤销前19个,但因为没有第20个对象,所以没有触发批量重偏向,二线程t3因为有第20个对象加锁所以触发批量重偏向,说明撤销偏向锁19次后,不会触发批量重偏向,只有第20个对象需要变更偏向才会触发批量重偏向。

参考资料:【黑马程序员深入学习Java并发编程,JUC并发编程全套教程-哔哩哔哩】 https://b23.tv/dt4w9la

标签:触发,20,t2,t3,t1,new,次后,偏向
From: https://blog.csdn.net/2301_76840501/article/details/140884921

相关文章

  • CVE-2022-4230 复现
    题目描述:WPStatisticsWordPress插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行SQL注入攻击。默认情况下,具有管理选项功能(admin+)的用户可以使用受影响的功能,但是该插件有一个设置允许低权限用户也可以访问它。根据描述,我们直接去查看wp-admin路......
  • 【2024暑#108】ACM暑期第三次测验(个人赛)
    A-猫抓老鼠经典的逆序对问题,这里就不过多阐述了有递归和树状数组两种写法,自行百度即可B-字符变换查看\((S[i]-T[i])\%26\)是否相同即可#include<bits/stdc++.h>usingnamespacestd;intmain(){stringS,T;cin>>S>>T;set<int>st;for(inti......
  • Ubuntu24.04-EDA2018.06
    0.PreperationWindows11VMwareWorkstation17ProUbuntu24.04VCS_VERDI2018.061.Install1.在ubuntu中新建synopsys文件夹cd/home/wenmkdirsynopsys#在/home/wen/目录下新建synopsys文件夹sudochmod777synopsys/#添加权限2.将windows文件下载到......
  • 机械电气领域会议合集 | 2024年下半年稳定检索EI国际学术会议推荐
    【JPCS出版|连续3届稳定EI检】第四届机电一体化技术与航空航天工程国际学术会议(ICMTAE2024)20244th InternationalConferenceon MechatronicsTechnologyandAerospaceEngineering*JPCS出版,南昌理工学院主办,检索历史良好大会官网:www.icmtae.org时间:2024年11月8-1......
  • 2020 China Collegiate Programming Contest, Weihai Site
    Preface难得没有发疯的一场,但只能说是症状减轻了,感觉离痊愈还有一定距离这场基本就跟着榜慢慢开题,中期下机的时候才发现J我把题意读假了然后让队友推了快3h的假结论,还好最后把J过了不然铁战犯A.GoldenSpirit签到分讨题,但也需要一些细心大致思路就是在\(2nt\)那个......
  • 2024/8/3每周总结
    ###每周总结####教学工作**时间:周一到周五每天上午****内容:**1.**数论部分**:-基础数论知识,包括质数、合数、最大公约数、最小公倍数等。-常见数论算法,如欧几里得算法。-模运算及其在解题中的应用。2.**线性结构部分**:-线性表的定义和实现,包括顺序表和链表......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(4) 3、5、9
    题单:2024“钉耙编程”中国大学生算法设计超级联赛(4)时间:07_2905多层血条思路就是模拟,上层和下层分开表示,如果dmg大于血条长度就全都置0,反之就要从上层开始置\('.'\)代码stringblood="ABCDE";stringstr[3];voidsolve(){cin>>n>>m>>hp>>dmg;str[0]......
  • 计算机基础(Windows 10+Office 2016)教程 —— 第7章 演示文稿软件PowerPoint 2016
    第7章演示文稿软件PowerPoint20167.1PowerPoint2016入门7.1.1PowerPoint2016简介7.1.2PowerPoint2016的操作界面组成7.1.3PowerPoint2016的窗口视图方式7.1.4PowerPoint2016的演示文稿及其操作7.1.5PowerPoint2016的幻灯片及其操作7.2演示文稿的编......
  • 计算机基础(Windows 10+Office 2016)教程 —— 第8章 多媒体技术及应用
    多媒体技术及应用8.1多媒体技术的概述8.1.1多媒体技术的定义和特点8.1.2多媒体的关键技术8.1.3多媒体技术的发展趋势8.1.4多媒体文件格式的转换8.1.5多媒体技术的应用8.2多媒体计算机系统的构成8.2.1多媒体计算机系统的硬件系统8.2.2多媒体计算机系统的软......
  • 2024暑假第五周总结
    Java面向对象通过封装、继承、多态等概念实现代码重用性、灵活性、和可维护性类和对象类是Java中用来描述对象共同特征的模板或蓝图,包括属性(字段)和方法。publicclassCar{privateStringbrand;privateintyear;publicCar(Stringbrand,intyear){......