synchronized锁升级以后会再降级吗?

news2024/11/8 20:54:54

Java对象头Markword的结构

在这里插入图片描述
其中,最低2位是10代表重量级锁,00代表轻量级锁,001代表无锁,101代表偏向锁。

synchronized锁在1.6的时候做了优化,当仅有一个线程竞争锁的时候,锁处于偏向锁的状态,当多个线程锁竞争不激烈的时候,锁会升级成轻量级锁,当竞争特别激烈以后,就升级成重量级锁了。
问题是,锁升级成重量级锁以后,还能不能降级程轻量级锁或者偏向锁?

打印对象头信息

添加依赖:

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

用下面一个api就够了:

ClassLayout.parseInstance(object).toPrintable();

测试代码

public class SynchronizedTest {
    private static Object lock  = new Object();
    public static void main(String[] args)throws Exception {
        lockUpgradeTest();
    }
    public static void lockUpgradeTest()throws Exception {
        System.out.println("业务低谷期。。。。。");
        // 偏向锁
        biz();
        System.out.println("业务高峰期开始。。。。。");
        CountDownLatch startLatch = new CountDownLatch(1);
        CountDownLatch stopLatch = new CountDownLatch(10);
        for(int i=0; i<10; i++){
            new Thread(()->{
                try{startLatch.await();}catch(Exception e){}
                // 大量锁竞争,升级成重量级锁
                biz();
                stopLatch.countDown();
            }).start();
        }
        startLatch.countDown();
        stopLatch.await();
        System.out.println("业务高峰期结束");
        // 过了一段时间,系统的访问量降下来了
        try{Thread.sleep(3000);}catch(Exception e){}
        // 此时的锁变成了轻量级锁
        biz();
        // 退出同步代码块变成了无锁
        System.out.println("退出同步代码块以后:");
        System.out.println(Thread.currentThread().getName() + ":" + ClassLayout.parseInstance(lock).toPrintable());
    }

    public static void biz(){
        synchronized (lock){
            System.out.println(Thread.currentThread().getName() + ":" + ClassLayout.parseInstance(lock).toPrintable());
            try{Thread.sleep(1);}catch(Exception e){}
        }
    }

输出结果如下:

业务低谷期。。。。。
 OFFSET  SIZE   TYPE DESCRIPTION         VALUE
      0     4        (object header)     05 f0 34 a8 (00000101 11110000 00110100 10101000) (-1472925691)
      4     4        (object header)     31 02 00 00 (00110001 00000010 00000000 00000000) (561)
      8     4        (object header)     00 10 00 00 (00000000 00010000 00000000 00000000) (4096)
     12     4        (loss due to the next object alignment)
业务高峰期开始。。。。
 OFFSET  SIZE   TYPE DESCRIPTION          VALUE
      0     4        (object header)      82 ff f7 d5 (10000010 11111111 11110111 11010101) (-705167486)
      4     4        (object header)      31 02 00 00 (00110001 00000010 00000000 00000000) (561)
      8     4        (object header)      00 10 00 00 (00000000 00010000 00000000 00000000) (4096)
     12     4        (loss due to the next object alignment)
     
业务高峰期结束
main:java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION        VALUE
      0     4        (object header)    a8 f5 0f 24 (10101000 11110101 00001111 00100100) (605025704)
      4     4        (object header)    99 00 00 00 (10011001 00000000 00000000 00000000) (153)
      8     4        (object header)    00 10 00 00 (00000000 00010000 00000000 00000000) (4096)
     12     4        (loss due to the next object alignment)

退出同步代码块以后:
main:java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION       VALUE
      0     4        (object header)   01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)   00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)   00 10 00 00 (00000000 00010000 00000000 00000000) (4096)

这就显然就发生了重量级锁(010)到轻量级锁(000)的转换。

ps:以上测试基于jdk11,如果是jdk8,请添加jvm启动参数:-XX:BiasedLockingStartupDelay=0

C:\Users\Administrator>java -version
java version "11.0.18" 2023-01-17 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.18+9-LTS-195)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.18+9-LTS-195, mixed mode)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bim技术的发展趋势是哪些方向?

BIM在现阶段已经取得了较高的发展水平。尽管BIM在许多方面取得了显著进展&#xff0c;但仍有继续改进和发展的空间。未来&#xff0c;BIM在数字化转型、智能化应用和全生命周期管理方面的进一步推进将成为发展重点。简单聊聊BIM技术的发展趋势包括以下几个方向&#xff1a; BIM…

Java面试通关:阿里内部实战模拟面试精讲题库,竟被上传GitHub!

其实这些技术在真正的实际开发环境中真的用得到吗&#xff1f;不一定的&#xff0c;但是没办法&#xff0c;环境就是如此&#xff0c;能做的也就只有不断提升自己&#xff0c;去适应市场环境&#xff0c;提高自身技术水平&#xff01; 我的建议&#xff0c;不管自己现在是个什…

2021北大生命科学院饶毅教授毕业致辞

在祝福裹挟着告诫呼啸而来的毕业季&#xff0c;请原谅我&#xff0c;不敢祝愿每一位毕业生都成功都幸福。因为历史不幸的记载着有人的成功&#xff0c;代价是丧失良知&#xff0c;有人的幸福&#xff0c;代价是损害他人。 从物理学来说&#xff0c;无机的原子&#xff0c;逆​热…

Loadrunner怎么实现MD5加密

目录 前言&#xff1a; 1、写一个md5.h文件&#xff0c;将其放入脚本路径下 2、在globals.h中加入#include “md5.h” 3、在Action中写脚本&#xff0c;脚本示例如下&#xff1a; 前言&#xff1a; 在 LoadRunner 中实现 MD5 加密可以通过使用 LoadRunner 提供的函数来完成…

Redis发布订阅的通讯模式

这个是非常简单的,我们只需要打开两个redis就可以轻松完成 通过Xshell工具两次连接linux,同时启动两个redis: 在第一个里面进行订阅: subscribe leq 在第二个里面进行发布: publish leq hello 这样就可以在订阅的里头看到刚刚发布的信息,没看之前订阅那块也会有提示

带纵深可跳跃横版闯关游戏模版

此项目是以《卡比猎人队》为蓝本开发的横版带纵深闯关游戏模版。内涵数据表配置文件。 购买链接&#xff1a; 微店购买链接 开发环境 开发引擎&#xff1a;CocosCreator3.6.3开发语言&#xff1a;TypeScript 包含的内容&#xff1a; 逻辑实现目录介绍&#xff08;game&am…

Visdom使用

Visdom Visdom是一个面向科学研究的可视化工具&#xff0c;可以帮助你可视化和理解数据。它是 Facebook Research 开发的一个基于 Python 的可视化库&#xff0c;可以在Web浏览器中实时显示和更新图表、图像、文本等各种数据。 1 安装Visdom 可以使用以下命令安装Visdom&…

海思平台图像的IQ调试

目录 1.何为ISP何为IQ调试 1.1、ISP概念 1.2、在哪里做ISP 1.3、何为IQ 1.4、总结 2.海思MPP中ISP的实现框架 2.1、官方文档 2.2、sample中ISP相关部分 2.3、sensor注册内部细节 2.4、ISP注册内部细节 3.IQ调试相关的概念 3.1、黑电平 3.2、镜头阴影矫正 3.3、坏点…

《移动互联网技术》第十一章 Android应用工程案例: 掌握Android系统的需求分析和设计以及 Android项目的程序测试和版本管理方法

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

1208道Java面试题(2023突击版),覆盖互联网大厂核心知识点

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

需求分析引言:架构漫谈(三)可用性专题

前文介绍了非功能性需求的各个指标和一些业界的标准。 非功能性需求里有一项可靠性&#xff0c;与之关联的一个指标叫可用性 本文对非功能性需求里的可用性、可靠性&#xff0c;进行一些详细的说明。 概念 我们在网上的云服务商处&#xff0c;经常看到产品介绍里会有这种字样…

Redis【实战篇】---- 分布式锁-redission

Redis【实战篇】---- 分布式锁-redission 1. 分布式锁-redission功能介绍2. 分布式锁-redission快捷入门3. 分布式锁-redission可重入锁原理4. 分布式锁-redission锁重试和WatchDog机制5. 分布式锁-redission锁的MutiLock原理 1. 分布式锁-redission功能介绍 基于setnx实现的分…

【AcWing算法基础课】第一章 基础算法(部分待更)

文章目录 前言课前温习一、快速排序核心模板1.1题目描述1.2思路分析1.3代码实现 二、归并排序核心模板2.1题目描述2.2思路分析2.3代码实现 三、二分查找整数二分题目一3.1题目描述3.2思路分析3.3代码实现 浮点数二分题目二3.1题目描述3.2思路分析3.3代码实现 四、高精度加法核心…

SpringBoot实战(十八)集成Feign

目录 一、简介1.定义2.关键特征 二、Maven依赖三、编写代码1.DemoController.java2.DemoFeignClient.java3.启动类注解 EnableFeignClients 四、测试 一、简介 1.定义 OpenFeign&#xff1a;是由 Netflix 开发的声明式的 Web 服务客户端。它简化了向 RESTful Web 服务发送 HT…

python接口自动化(八)--发送post请求的接口(详解)

简介 上篇介绍完发送get请求的接口&#xff0c;大家必然联想到发送post请求的接口也不会太难&#xff0c;被聪明的你又猜到了。答案是对的&#xff0c;虽然发送post请求的参考例子很简单&#xff0c;但是实际遇到的情况却是很复杂的&#xff0c;因为所有系统或者软件、网站都是…

HOT31-K个一组翻转链表

leetcode原题链接&#xff1a;K个一组翻转链表 题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余…

html实现酷炫好看的个人介绍主页(附源码)

文章目录 1.设计来源1.1 主界面1.2 我的简介界面1.3 教育经历界面1.4 我的源码界面1.5 我的相册界面1.6 朋友评价界面1.7 热门文章界面1.8 联系我界面 2.效果和源码2.1 动态效果2.2 源代码2.3 代码目录 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csd…

vue3使用高德地图实现点击获取经纬度以及搜索功能

话不多说直接上干活 在此之前你需要有高德地图的 key&#xff0c;这个自己去申请即可 1&#xff0c;首先需要在终端安装 npm i amap/amap-jsapi-loader --save 2&#xff0c;准备一个容器 <template><div id"container"></div> </templat…

Python 识别拼图验证码

需要识别的某易易盾验证码如下: 识别过程也是非常简单,使用现成的拼图库就行,本文记录一下使用心得(其实也没啥心得,开箱即用,太简单了): 首先,下载gaps拼图库 Install requirements: $ pip install -r requirements.txt $ sudo apt-get install python-tkInstall …

爱奇艺数据湖实战-广告数据湖应用

01 背景 广告数据主要包括效果、品牌和ADX等广告形式的请求和投放链路中产出的一系列日志&#xff0c;经过处理后&#xff0c;用于算法模型训练、广告运营分析、广告投放决策等场景。广告业务对数据的时效性、准确性以及查询性能要求较高。目前&#xff0c;广告数据链路整体采用…