synchronized 原理(锁升级、锁消除和锁粗化)

news2024/11/15 11:01:35

目录:

一、前言

二、锁升级

三、锁消除

四、锁粗化


一、前言

根据之前的锁策略,可以总结出, synchronized 具有以下特性( JDK 1.8):

1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁。

2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁。

3. 实现轻量级锁的时候可能用到的是自旋锁策略

4. 是一种不公平锁

5. 是一种可重入锁

6. 不是读写锁

对于synchronized来说,多个线程,针对同一个对象加锁,就会产生阻塞等待,synchronized 内部其实还有一些优化机制,存在的目的就是为了让这个锁更高效,更好用。

二、锁升级

在加锁之前是无锁状态,在进行加锁的时候,首先会进入到偏向锁状态(偏向锁,并不是真正的加锁,而是相当于占了一个位置,有需要的才去真正的加锁,没有需要就不加锁了)。偏向锁的这个过程,有点相当于“懒汉模式”的懒加载差不多,“非必要,不加锁”。

进入sychronized的时候,并不是真的加锁,先处在偏向锁状态,做个标记(这个过程是非常轻量的)。

如果整个使用锁的过程中,都没有出现锁竞争,在synchronized执行完之后,取消偏向锁,回到无锁状态。但是,如果使用过程中,另一个线程也尝试加锁,那么在它加锁之前,迅速的把偏向锁升级成真正的加锁状态!!!另一个线程也就只能阻塞等待了。

当synchronized发生锁竞争的时候,就会从偏向锁,升级成轻量级锁。此时, synchronized相当于是通过自旋的方式,来进行加锁的。如果要是很快别人就释放锁了,自旋是划算的,但是如果迟迟拿不到锁,一直自旋,并不划算,synchronized自旋不是无休止的自旋,自旋到一定程度之后,就会再次升级成重量级锁(挂起等待锁)。此时,如果线程进行了重量级锁的加锁,并且发生锁竞争,此时线程就会被放到阻塞队列中,暂时不参与CPU调度了,然后直到锁被释放了,这个线程才有机会被调度到,并且有机会获取到锁。

另外,锁升级后不能降级了。

三、锁消除

编译器智能的判定,看当前的代码是否是真的要加锁,如果这个场景不需要加锁,程序猿也加了,那么就会自动把锁给干掉。比如:StringBuffer 带有synchronized,但是如果在单线程中使用StringBuffer, synchronized加了也白加,此时编译器就会直接把这些加锁操作干掉了。

四、锁粗化

锁的粒度: synchronized包含的代码越多,粒度就越粗;包含的代码越少,粒度就越细。

通常情况下,认为锁的粒度细一点比较好。加锁的部分的代码,是不能并发执行的,锁的粒度越细,能并发的代码就越多;反之就越少。

但是有些情况下,锁的粒度粗一些反而更好,两次加锁解锁之间,间隙非常小,此时,不如就直接一次大锁搞定得了。每次加锁可是都有开销的,并发节省的时间,反而不如加锁的开销大。

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

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

相关文章

Javascript 职责链模式

现实中的职责链模式 职责链模式的例子在现实中并不难找到,以下就是两个常见的跟职责链模式有关的场景。 ❏ 如果早高峰能顺利挤上公交车的话,那么估计这一天都会过得很开心。因为公交车上人实在太多了,经常上车后却找不到售票员在哪&#x…

年前最后一次分享5款小工具

马上要回家过年了,今年最后一次分享,希望大家喜欢。 1.图片管理器——Imagine 在管理器支持直接预览压缩包图片。支持图片编辑、图片批量转换、批量重命名、支持 GIF 动态图片编辑。如插入帧、修改帧的速度、循环播放、尺寸。同时还支持让系统右键菜单…

熟悉 NestJS (文末附视频)

前言 经过了需求分析以及技术选型之后,我们正式步入了第三个环节:脚手架搭建。 工欲善其事,必先利其器,NestJS 为开发者提供了很多开箱即用的功能,我们可以根据团队的需求搭建一套适配所有业务开发的基础脚手架。所以…

帮助有一定计算机基础的人 快速复习并重新拾起C语言基础

这里写目录标题1.C语言程序举例2.详解C语言程序结构1)#include2)main 函数:3){} 括号,程序体和代码块4)注释5)print 函数6)return 语句3 C程序的编译步骤是怎样?4.数据的…

【Go基础】面向对象和反射机制

文章目录一、面向对象1. 面向对象的概念2. 构造函数3. 继承与重写4. 泛型二、反射1. 反射介绍2. 反射的基础数据类型3. 反射API3.1 reflect.Type①如何得到Type②指针Type转为非指针Type③获取struct成员变量的信息④获取struct成员方法的信息⑤获取函数的信息⑥判断类型是否实…

『 MySQL篇 』:MySQL表的CURD操作

📢 MySQL 系列专栏持续更新中 … MySQL专栏 ​ 目录 目录一、SQL语句- SQL通用语法- 注释- SQL语句分类二、 基础表操作- 创建表- 查看库中的表- 查看表结构- 删除表- 重命名表三、MySQL 中的增删查改操作- 增加(insert语句)- 查询(select语…

CSS 使用 @font-face 引入外部字体

CSS 使用 font-face 引入外部字体下载所需字体到本地把下载字体文件放入font文件夹里定义字体引用字体结果😬没有退路时,潜能就发挥出来了 CSS 中使用开源字体 得意黑 得意黑的字体是真的好看 ✨推荐使用 下载所需字体到本地 这里介绍一款不错的中文字…

Shiro:核心组件、配置类、多Realm场景、自定义拦截器、实战场景

目录Shiro 的核心组件Shiro 认证流程Shiro 授权流程单 RealmShiro 登陆认证 SimpleAuthenticationInfo 对象多 RealmShiroConfigShiro过滤器配置 ShiroFilterFactoryBeanShiro自定义过滤器Shiro 过滤器执行链路梳理代码自取层级结构Login.javaBearerTokenRealm.javaShiroRealm.…

桶排序详细说明及实现-python

前言: 说到桶排序,那必定要有桶,那么桶的作用是什么呢?桶的作用就是将序列分为若干份放到桶中,每个桶中能装入的数量范围是一定的,只有最后一个桶可以设置装入很多。这是因为当分的桶一定时,前面…

SpringMVC-基础入门

文章目录SpringMVC1,SpringMVC概述2,SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤…

【软考】系统集成项目管理工程师(十五)项目采购管理

一、项目采购管理概述二、项目采购管理子过程1. 编制采购管理计划2. 实施采购3. 控制采购4. 结束采购三、招投标1. 招标人的权利和义务2. 招标代理机构的权利和义务3. 招标方式和招投标程序4. 相关的法律责任一、项目采购管理概述 采购意味着从外界来源获得商品或服务,采购一…

Vue3组件初始化流程分析

本文主要来分析 vue3 组件的初始化(基于runtime-core(核心运行时)包),将从createApp、mount 等常用 API 入手来分析组件的挂载、普通元素的挂载流程。 createApp 1、创建一个应用实例。使用方式如下: import { createApp } from vue import App from ./App.vueco…

进制转换(二进制、八进制、十进制、十六进制)超详细版

今天来总结一下各种进制转换问题,详细齐全易于理解,希望对你有帮助哦! 各种进制之间的相互转换 先从我们最熟悉的十进制入手吧,其他进制与十进制的转换方法都是一样的。 整型有4种进制形式: 1.十进制: …

[ChatGPT]

最近hatGPT火爆全宇宙,几乎所有圈内人都在谈论这个美国人工智能公司OpenAI发布免费机器人对话模型ChatGPT(GPT-3.5系列),模型中首次采用RLHF(从人类反馈中强化学习)方式。模型目前处于测试阶段,…

Windows 服务器刷题(2)(带答案)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.刷题 前言 本章将会讲解Windows服务器刷题(2) 一…

新年礼物已收到!2022 Apache IoTDB Commits 数量排名 3/351!

社区喜报!据 The Apache Software Foundation 官方 Projects Statistics(项目信息统计网站)的实时数据显示,Apache IoTDB 在过去 12 个月(即 2022 年度)共发表 6829 Commits,排名 2022 年度 Apa…

C++ Primer笔记——默认移动操作、移动迭代器、左右值引用成员函数、标准库仿函数、function包装器

目录 一.P476 合成的移动操作 二.P480 移动迭代器 三.P483 右值和左值引用成员函数 四.P510 标准库定义的仿函数 五.P512 标准库function类型(包装器) 一.P476 合成的移动操作 什么时候会有默认的移动构造和移动赋值函数,需满足以下几点…

Java设计模式-中介者模式Mediator

介绍 中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式属于行为型模式,使代…

linux搭建webapp实战

首先介绍下linux,linux因其开源,定制化高,安全等原因,成为了目前web应用部署首选的操作系统,linux操作系统有很多版本,常见的有centos,debian,RHLE,redhat,乌…

【Linux】gcc/g++编译器、make/Makefile自动化构建工具

作者:小卢 专栏:《Linux》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 1.gcc/c的概念: 2.程序编译过程详解: 2.1程序编译过程: 2.…