JavaEE 第13节 synchronized关键字基本实现原理

news2024/12/29 2:06:25

目录

synchronized的基本特点:

synchronized关键字的底层实现:

1)锁升级

2)锁消除

3)锁粗化


synchronized的基本特点:


以下特点只考虑(jdk1.8):

1)刚开始是乐观锁,如果出现所冲突转变成悲观锁。

2)开始时,使用的轻量级锁实现,如果锁持有时间过长,那么会转变成重量级锁。

3)轻量级锁,大概率使用的时自旋锁实现。

4)不是读写锁/也不是公平锁。

5)是可重入锁。


synchronized关键字的底层实现:

synchronized关键字非常强大可以自适应大多数加锁环境,进而让程序员不用考虑太多因素就能写出运行效率较高的程序。


1)锁升级

锁升级意思是synchronized关键字会根据程序时的实际情况,动态的改变锁策略,从而兼顾大部分加锁环境,在能保证现成安全的情况下,又能够兼顾程序性能,可见其强大之处。

锁升级大致分为这几个步骤:

         1、偏向锁:在同步块中的程序不会立即上锁,而是进入偏向锁的状态;

“偏向锁” ,并没有给对象加锁,只是在对象头中做了一个“标记”,记录这个锁属于那个线程。

如果后续没有线程来竞争这把锁,那么就不会进行加锁操作(类似懒汉模式,不得不加才加),避免不必要的开销。

如果后续有锁来竞争,才会去加锁,一般会进入轻量级锁的状态。

        2、轻量级锁:当从偏向锁转化成轻量级锁,一般先尝试使用自旋锁(CAS实现)获取轻量级锁。

在每次锁持有时间较短,或者锁竞争较弱时,使用自旋锁效率较高。

        3、重量级锁:当锁竞争激烈,自旋多次没有获取到锁的时候,轻量级锁会升级成重量级锁。

重量级锁的实现更为复杂,涉及内核态用户态交互,考校比较大,但这也是为了线程安全的无奈之举。

注意:锁升级的步骤是不可逆的,比如重量级锁不能转化成轻量级锁。

2)锁消除

在程序 圆 写完代码执行程序前,编译器+JVM还会再次检查代码,判断程序中是否有一些地方加锁是无意义的,那么就会消除这个锁。

比如在单线程环境下使用StringBuffer这个含有synchronized关键字的类,那么这个加锁操作是没必要的,只会浪费资源开销。

3)锁粗化

锁粗化是一种优化技术,将多个连续的加锁、解锁操作合并为一个更大范围的加锁、解锁操作。这减少了加锁和解锁的次数,从而降低了性能开销。

锁粗化是一种优化技术,将多个连续的加锁、解锁操作合并为一个更大范围的加锁、解锁操作。这减少了加锁和解锁的次数,从而降低了性能开销。

示例:

优化前(细粒度锁):

synchronized(lock) {
    // 操作1
}
synchronized(lock) {
    // 操作2
}
synchronized(lock) {
    // 操作3
}

优化后(粗化锁):

synchronized(lock) {
    // 操作1
    // 操作2
    // 操作3
}

通过合并多个同步块,synchronzied减少了加锁解锁的开销,提高了效率。这在循环或连续操作中特别有用。

需要注意的是,过度粗化可能会增加锁的持有时间,影响并发性能,因此应根据具体情况权衡使用,不过这里不用担心,JAVA开发人员,肯定是能保证其性能的。


可以看到synchronized的实现实际上是个非常复杂的过程,背后做了很多事。这样让“菜鸡”程序员也能写出运行效率还不错的程序。

JVM的开发者为程序员操碎了心。

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

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

相关文章

高可用集群keep-alive

keepalive简介 keepalive为LVS应用延伸的高可用服务。lvs的调度器无法做高可用。但keepalive不是为lvs专门集群服务的,也可以为其他的的代理服务器做高可用。 keepalive在lvs的高可用集群,主调度器和备调度器(可以有多个) 一主两备或一主一备。 VRRP: k…

Windows下枚举USB设备信息Demo

目录 1 简介 1.1 设备接口类 1.2 枚举设备信息原理 2 SetupDi系列函数介绍 2.1 SetupDiGetClassDevs 2.2 SetupDiEnumDeviceInfo 2.3 SetupDiGetDeviceRegistryProperty 2.4 SetupDiGetDeviceRegistryProperty 3 演示Demo 3.1 开发环境 3.2 功能介绍 3.3 下载地址 …

70 爬楼梯

解题思路一:(动态规划) \qquad 假设F(n)返回的是爬n阶的所有方法个数,由题可知,每次可以爬1-2级台阶,那么可以得到: \qquad \qquad \qquad \qquad \qquad F(n) F(n - 1) F(n - 2) \qquad 我…

WeTab AI桌面端的下载安装

wetab AI的使用很方便,收费也不高,专业版的最新版本的AI核心配置如下: 现在推出了桌面端,下载链接:桌面端下载链接 在下载页面点击windows(Beta版): 下载并安装,桌面上就…

DRF组件讲解

DRF组件 1. Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。 前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需…

LLM agentic模式之工具使用: Toolformer、CoA、MM-React思路

Toolformer Toolformer出自2023年2月Meta上传的论文《Toolformer: Language Models Can Teach Themselves to Use Tools》,它提出了一种通过自监督训练的方式来让模型决定调哪个API什么时候调用。 API调用的表示:为了让模型去能够调用API,将…

实现随机地牢与摄像机追随与拖拽

//author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞检测 在拖拽,绘制,放大缩小中 // 2024-7-20 // 直线改每帧打印一个点,生长的直线,直线炮弹 // 2024-8-4 // 实现敌…

JavaScript高级程序设计 -- -- 观后记录

一、什么是 JavaScript 1、JavaScript 实现 完整的 JavaScript 实现包含以下几个部分: -- --  核心(ECMAScript)  文档对象模型(DOM)  浏览器对象模型(BOM) 2、DOM 文档对象模型&#…

橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码

源码名称:酷黑简洁大气体育直播自适应模板赛事直播门户网站 源码开发环境:帝国cms 7.5 安装环境:phpmysql 带采集,可以挂着电脑上自动采集发布,无需人工操作! 橙色简洁大气体育直播自适应模板赛事直播门户…

广州必看自闭症康复机构十大排名名单出炉

在众多为自闭症儿童提供帮助的机构中,星贝育园以其卓越的服务和显著的成效脱颖而出,成功跻身广州必看自闭症康复机构十大排名。 星贝育园在广州、浙江拥有三个校区,为更多的自闭症儿童和家庭带来了希望。这里的特教老师和生活老师不辞辛劳&a…

一次现网redis CPU使用率异常定位

背景 618大促前,运维对系统做巡检时发现redis cpu利用率白天基本保持在72%左右,夜里也在60%以上。担心618流量比平时大,导致redis超负荷,因此找开发进行优化,降低redis的负载。 定位思路 其实资源使用率过高定位都…

大数据技术—— Clickhouse安装

目录 第一章 ClickHouse入门 1.1 ClickHouse的特点 1.1.1 列式存储 1.1.2 DBMS的功能 1.1.3 多样化引擎 1.1.4 高吞吐写入能力 1.1.5 数据分区与线程级并行 1.1.6 性能对比 第二章 ClickHouse的安装 2.1 准备工作 2.1.1 确定防火墙处于关闭状态 2.1.2 CentOS取消…

Vue UI - 可视化的Vue项目管理器

概述 Vue CLI 3.0 更新后,提供了一套全新的可视化Vue项目管理器 —— Vue UI。所以要想使用它,你的 Vue CL I版本必须要在v3.0以上。 一、启动Vue UI 1.1 环境准备 1.1.1 安装node.js 访问官网(外网下载速度较慢)或 http://nod…

民航管理局无人机运营合格证技术详解

1. 证书定义与意义 民航管理局无人机运营合格证(以下简称“合格证”)是对符合民航法规、规章及标准要求的无人机运营单位或个人进行资质认证的重要证明。该证书旨在确保无人机运营活动的安全、有序进行,保护国家空域安全,维护公众…

电子电气架构 --- 软件定义汽车需要怎么样的EE架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…

反射型XSS的几种payload

目录 第一种&#xff1a;采用的是urlcode编码 第二种&#xff1a;前面用html实体编码&#xff0c;后面用urlcode编码 第三种&#xff1a;只对&#xff1a;使用urlcode编码 第四种&#xff1a;对<>进行html实体编码 第五种&#xff1a;textarea 第六种&#xff1a;和…

【JavaEE】锁策略和CAS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f4b0;一.常见的的锁策略 锁策略&#xff08;Locking Strategy&#xff09;是指在多线程环境中&#xff0c;为了控制对共享资源的访问&#xff0c;确保…

「OC」探索CALayer:基础知识与实用技巧简要介绍

「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍 文章目录 「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍前言认识CALayerCALayer的相关属性 UIView和CALayer区别联系创建UIView和CALayer的原因 开始创建CALayer视图层级CALayers 和 Sublayersposition与…

javaweb-flex布局

1. flex布局原理 flex是flexible Box的缩写&#xff0c;意味着"弹性布局"&#xff0c;用来为盒子模型提供最大的灵活性&#xff0c;任何一个容器都可以指定为flex布局。 当我们为父盒子设为flex布局以后&#xff0c;子元素的float、clear和vertical-align属性都将失…

【质因数分解】将正整数分解质因数

将一个正整数分解成质因数&#xff0c;例如&#xff1a;输入90&#xff0c;打印输出 902*3*3*5 使用C语言实现&#xff1a; #include<stdio.h>int main(){int n,i;printf("请输入需要分解的正整数&#xff1a; ");scanf("%d",&n);for(i2;i<…