synchronized实战:synchronized 锁升级过程

news2024/11/19 23:36:17

在这里插入图片描述
在这里插入图片描述
下面程序通过对加锁前后Object对象字节码的打印验证了对象由无锁到偏向锁的过程。

public class T01 {
    public static void main(String[] args) {
        Object o = new Object();
        System.out.println(ClassLayout.parseInstance(o).toPrintable());
        o.hashCode();
        System.out.println(ClassLayout.parseInstance(o).toPrintable());
        synchronized (o){
            System.out.println(ClassLayout.parseInstance(o).toPrintable());
        }
    }
}

运行上面程序,输出结果如下
在这里插入图片描述

Java 中的synchronized锁升级过程实际上是锁的粗化(Coarsening)和锁的细化(Fine-grained Locking)之间的权衡过程。锁升级的过程会根据执行情况来动态调整锁的粒度,以优化性能。下面是一个简单的程序示例,演示了锁的升级过程:

public class LockUpgradeDemo {

    private static final Object lock = new Object();

    public static void main(String[] args) {
        // 启动两个线程
        Thread thread1 = new Thread(new CoarseLockTask());
        Thread thread2 = new Thread(new FineGrainedLockTask());

        thread1.start();
        thread2.start();
    }

    // 粗粒度锁任务
    static class CoarseLockTask implements Runnable {
        @Override
        public void run() {
            synchronized (lock) {
                System.out.println("Coarse-grained Lock: Start");

                try {
                    Thread.sleep(1000); // 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("Coarse-grained Lock: End");
            }
        }
    }

    // 细粒度锁任务
    static class FineGrainedLockTask implements Runnable {
        @Override
        public void run() {
            System.out.println("Fine-grained Lock: Start");

            synchronized (lock) {
                try {
                    Thread.sleep(500); // 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("Fine-grained Lock: Inside synchronized block");
            }

            System.out.println("Fine-grained Lock: End");
        }
    }
}

在这个示例中,有两个线程,一个使用粗粒度锁(CoarseLockTask),另一个使用细粒度锁(FineGrainedLockTask)。粗粒度锁在执行期间持有锁,而细粒度锁在执行期间释放了锁,然后重新获取了锁。

运行这个程序,你会看到两个线程的输出交错进行,其中细粒度锁的输出在粗粒度锁的输出中间。这演示了锁的升级过程,其中锁会根据实际执行情况在粗粒度和细粒度之间动态切换,以提高性能。

请注意,实际的锁升级过程是由JVM和编译器进行管理和优化的,程序员通常无需手动干预。这个示例只是为了演示锁升级的概念。

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

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

相关文章

Linux界的老古董

Slackware 是由 Patrick Volkerding 制作的 Linux 发行版,从 1993 年发布至今也一直在 Patrick 带领下进行维护。7 月 17 日,Slackware 才刚刚过完它 24 岁的生日,看似年纪轻轻的它,已然是 Linux 最古老的发行版。 Slackware 的发…

laravel框架 - 安装初步使用学习 composer安装

一、什么是laravel框架 Laravel框架可以开发各种不同类型的项目,内容管理系统(Content Management System,CMS)是一种比较典型的项目,常见的网站类型(如门户、新闻、博客、文章等)都可以利用CM…

【Linux学习笔记】权限

1. 普通用户和root用户权限之间的切换2. 权限的三个w2.1. 什么是权限(what)2.1.1. 用户角色2.1.2. 文件属性 2.2. 怎么操作权限呢?(how)2.2.1. ugo-rwx方案2.2.2. 八进制方案2.2.3. 文件权限的初始模样2.2.4. 进入一个…

Linux基础操作

ls [-a -l -h] [Linux路径] 当不使用选项和参数,直接使用ls命令本体,表示以平铺的方式:列出当前工作目录下的内容 ls -a -a表示all的意思,即列出所有文件(包含隐藏的文件和文件夹) ls -l 以竖列的形式展示信…

linux C语言 socket的server、client 实现

讲解: 在Linux中,使用socket与另一端建立连接通常涉及到以下步骤: 1. 创建Socket:首先,你需要创建一个套接字(socket)。你可以使用socket()系统调用来创建套接字。通常,你需要指定套接字的类型&#xff0…

ssh服务登录原理与配置

文章目录 前言一、基于口令的认证(用户名密码)二、基于公钥的认证(免密登录)三、禁止用户登录和修改端口四、免密登录具体操作 前言 非对称加密是在认证用户连接的时候使用的,对称加密是在用户连接之后开始传输数据的…

【C++】深拷贝和浅拷贝 ④ ( 深拷贝示例 )

文章目录 一、深拷贝示例1、浅拷贝问题2、自己实现深拷贝 二、深拷贝完整代码示例 一、深拷贝示例 1、浅拷贝问题 在上一篇博客 【C】深拷贝和浅拷贝 ③ ( 浅拷贝内存分析 ) 中 , 使用了浅拷贝 , 将 原始对象 Students 赋值给了 拷贝对象 Student s2 ; 使用 C 编译器 生成的 默…

Mysql的基本查询练习

目录 一、Create 1.1单行数据全列插入 1.2 多行数据指定列插入 1.3插入否则更新 1.4 替换 二、Retrieve 2.1全列查询 2.2指定列查询 2.3查询字段为表达式 2.4为查询结果指定别名 2.5 结果去重 2.6 where 条件 2.6 NULL的查询 2.7 结果排序 三、 Update 四、Dele…

电力系统直流潮流分析【N-1】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

VHOST-SCSI代码分析(0)VHOST概述

与VIRTIO框架相比,VHOST将设备放到HOST上,让Guest和Host Kernal Space之间共享virtqueue,减少Exception Level切换。 对于数据的传递,依次经历:Guest UserSpace(EL0)-> Guest KernelSpace&am…

MySQL索引,事务及存储引擎

目录 MySQL索引 创建索引的依据: 索引的类型 普通索引 唯一索引 主键索引 组合索引 全文索引 查看索引 删除索引 事务 事务的 ACID 特性 原子性 一致性 隔离性 持久性 隔离级别 设置隔离级别 事务管理操作 自动提交事务 存储引擎 M…

GODIVA论文阅读

论文链接:GODIVA: Generating Open-DomaIn Videos from nAtural Descriptions 文章目录 摘要引言相关工作Video-to-video generationText-to-image generationText-to-video generation GODIVA方法逐帧视频自动编码器GODIVA视频生成器 实验数据集评价指标自动评估指…

QT基础教程(对话框1)

文章目录 前言一、对话框概念二、模态对话框三、非模态对话框总结 前言 本篇文章我们来讲解QT中的对话框。 资料合集地微信公众号:优质程序猿一、对话框概念 在Qt中,对话框(Dialog)是一种用于与用户进行交互、收集输入或展示信…

适用于 Android 的 Windows 子系统™️发行说明

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 内部版本 2304.40000.3.0 内部版本 2303.40000.3.0 内部版本 2302.4000 内部版本 2301.40000.4.0 内部版本 221…

【wxWidgets 如何实现wxAccordion 手风琴组件】

1. 简要说明 wxWidgets 并没有提供wxAccordion 手风琴组件面板, 网上也基本没有找到资料,CSDN有个标题:wxAccordion:wxWidgets的手风琴控件下载链接,再无资料可查, 但是其他语言是提供了手风琴面板组件的, 那么怎么办呢,开干喽… 2. 效果展示 3. 交流探讨 代码就暂时不发了,…

【LeetCode-简单题】225. 用队列实现栈

文章目录 题目方法一:单个队列实现 题目 方法一:单个队列实现 入栈 和入队正常进行出栈的元素其实就是队列的尾部元素,所以直接将尾部元素弹出即可,其实就可以将除了最后一个元素的其他元素出队再加入队,然后弹出队首元…

第二章 进程与线程 八、处理机调度(时机切换、过程调度方式)

一、进程调度的时机 二、进程调度的方式 1、非剥夺调度方式: 非剥夺调度方式,又称非抢占方式。即只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻…

virtualbox配置ubuntu1804虚拟机相关流程

virtualbox配置ubuntu1804虚拟机相关流程 相关版本能解决的问题安装流程1:新建虚拟机安装流程2:配置虚拟机安装流程3:安装虚拟机系统安装流程4:设置ubuntu 相关版本 virtualbox使用VirtualBox官网下载的6.1.34 r150636 版。ubunt…

CSRF攻击原理详解

CSRF概念: CSRF定义: 跨站请求伪造(英语:Cross-site request forgery)是一种对网站的恶意利用,也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种…

通用商城项目(下)之——Nginx的安装及使用

(作为通用商城项目的一个部分,单独抽离了出来。查看完整见父页面: ) 加入Nginx-完成反向代理、负载均衡和动静分离 1.配置SSH-使用账号密码,远程登录Linux 1.1配置实现 1、配置sshd 1)sudo vi /etc/ssh/sshd_confi…