synchronized 重量级锁分析

news2024/10/7 10:22:19

synchronized 重量级锁分析

1. 背景

在JDK1.6以前,synchronized 的工作方式都是这种重量级的锁。它的实现原理就是利用 kernel 中的互斥量,mutex。主要是内核中的mutex 能够保证它是一个互斥的量。如果线程1拿到了 mutex,那么线程2就拿不到了。这是内核帮我们保证的。

至于为什么可以,可以去了解一下内核中的互斥量。

2. 为啥叫做重量级锁

内核需要去申请这个互斥量,必须要进入内核态。也就是这里需要用户态,内核态的切换。状态的切换,开销是比较大的。这就是重型锁的一个弊端。对于重型锁的一些主要的封装都是在 c 语言中的 pthread 这样一个库中,比如mutex_init, mutex_lock 等。之所以叫重量级锁,就是因为需要进入到内核态。

3. 能否在用户态实现一把互斥锁

我们不需要进入到内核态就能够获取到这样的一把锁,也就是在用户态就可以实现一把锁。

比如说,现在就有一把锁,就叫做 state。0:表示未被使用,1 表示锁被占用了。

lock 的实现

在这里插入图片描述

如果锁当前是被占用的状态,那么程序就一直死循环。如果某个时刻,有一个线程把锁释放了,那么就退出死循环,执行下一行 state = 1。而且持有者=当前线程。也就是 state = 0的时候,就可以任务当前线程可以拿到这把锁了。

unlock 的实现

在这里插入图片描述

释放锁的时候,首先需要判断一下当前持有锁的线程是不是当前线程。如果是当前线程,那么就将 state 置为0, 持有者 = null。

当前设计方式存在的问题

while(state==1); state = 1;其实可以认为这个是比较赋值俩步操作,先比较,符合条件了,再进行赋值。那么其实这不是原子性的。比如说在比较的时候,俩个线程同时进行了比较,这俩个线程同时发现state = 0,那么这俩个线程同时都去会执行 state = 1的操作,这俩个线程都认为自己拿到了锁,那么这个就产生了并发的问题了。

如何改进这个问题呢?

我们看到比较和赋值不是原子性的,在软件层面,我们也无法保证这俩步的原子性。所以,计算机给我们提供了原语,也就是 CAS。

在这里插入图片描述

那么我们来看一下如何改进呢? 我们把比较赋值这俩步操作,变成了一个原语操作,CAS。比较并交换。CAS中有三个参数,cas(state,0,1)。比较state的当前值是不是0,如果是0,那么就赋值为1。

在这里插入图片描述

再看看一下 unlock的操作。 在unlock操作中,其实也是一个比较赋值的操作,首先判断当前持有者是不是当前线程,如果是,再进行赋值。那为什么这里不需要用cas呢?因为必定是持有锁的线程才能执行到下一行。

而且赋值操作中,先赋值 持有者 = null。再赋值 state = 0。因为如果先执行 state = 0, 那么就相当于先释放掉这把锁了,另外一个线程就会执行 lock 成功,拿到锁,持有者 = 当前线程。那么就可能会带来一些问题。因为此时释放掉的锁并不是当前线程持有的锁。

这种锁也叫做自旋锁。

自旋锁的优点与缺点

自旋锁,spinLock。自旋锁不需要进入到内核态,整个程序的执行都是在用户态的,包括cas。但是cas不是计算机的原语吗?因为计算机的指令和用户态,内核态没有关系。

自旋锁当然也有缺点。 lock 操作如果一直没有拿到锁的话,会一直尝试。这是需要消耗cpu资源的。 所以自旋锁对于锁竞争比较激烈的情况下,是不适用的。

总结

mutex锁和自旋锁各有优缺点,那么我们能不能把这俩者结合一下呢? JDK 1.4 以前是借助内核中的 Mutex 互斥量; JDK1.4 以后是利用自旋锁,自旋n次以后,还是没有拿到锁的话,就切换到mutex。也就是将自旋锁和mutex进行了一个结合。因为mutex 加锁失败以后,会挂起,让出cpu资源。这样的话,算是对资源的一个合理利用。 JDK1.4以前,我们是可以设置自旋次数的,但是1.6以后,JDK可以自适应自旋,不用设置这个参数了。

当然现在我们所说的都是重量级锁。包括mutext, 自旋锁,自适应自旋锁。

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

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

相关文章

二十三、Kubernetes中Pod控制器分类、ReplicaSet(RS)控制器详解

1、概述 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建 控制器创建的pod:kub…

小米应用商店APP侵权投诉流程

目录一、官方指引二、侵权投诉流程1.侵权投诉通知和反通知流程2.受理渠道3.权利人发起侵权通知邮件一、官方指引 https://dev.mi.com/distribute/doc/details?pId1142 二、侵权投诉流程 1.侵权投诉通知和反通知流程 2.受理渠道 对外邮箱:developerxiaomi.com …

云呐|固定资产盘点APP

如果工人想做好他们的工作,他们想做好他们的工作。目前,行政事业单位对固定资产管理进行一物一卡一码管理,根据条形码粘贴和扫码总结,是目前科学完善的总结方法,具有快速、高效、准确的特点。对于这种方法,…

5.6、TCP超时重传时间的选择

超时重传时间的选择是 TCP 最复杂的问题之一 1、超时重传时间RTO的选取 假设主机 A 给主机 B 发送 TCP 数据报文段 000,并记录下当前的时间 主机 B 收到后,给主机 A 发送相应的确认报文段 主机 A 收到确认报文段后,记录下当前的时间 那么…

为什么BI仪表板的共享功能对企业如此重要?

随着大数据的发展,企业逐渐将数据作为其决策的重要组成部分,共享商业智能 (BI) 仪表板显得越来越重要。例如,在员工之间共享BI仪表板,不仅可以做出更好的数据驱动决策,还可以更好地提高工作透明度和问责制,…

Golang时间处理容易踩坑,小心损失百万

简介 在各个语言之中都有时间类型的处理,因为这个地球是圆的(我仿佛在讲废话),有多个时区,每个时区的时间不一样,在程序中有必要存在一种方式,或者说一种类型存储时间,还可以通过一系…

手写RPC框架第8版-通过SpringBoot-Starter接入SpringBoot

源代码地址:https://github.com/lhj502819/IRpc/tree/v9 系列文章: 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现基于线程和队列提升框架并发处理能力框架容错性相关设计通过SpringBoot-Starte…

LayoutInflater学习(二)之创建布局View

这篇是在上篇的基础上继续学习LayoutInflater,上篇主要讲了LayoutInflater是怎么解析布局的,但是并没有去仔细地说明LayoutInflater创建View的过程,这篇就补上这部分。 LayoutInflater创建xml布局View是分开创建的: 1. 先创建xml布局最外层的View,也就是布局的根View 2. 递归…

package.json和package-lock.json的区别

前言 今天正在写代码,同学突然问我,package.json和package-lock.json有什么区别,这两个文件有什么用?我愣住了… 模块化开发 经过这么多年的发展,现在的前端开发基本上都是模块化开发了。而node和npm则可以很方便的…

电网调频及一次调频、二次调频

电网调频的基本概念电力系统运行的主要任务之一是对电网频率进行控制—控制电网频率在50Hz附近的一个允许范围内。电网频率偏离额定值50Hz的原因是能源侧(水电、火电、核电……)的供电功率与负荷侧的用电功率之间的平衡被破坏而引起的。负荷的用电功率是…

Sentinel热点参数限流

何为热点? 何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K数据,并对其访问进行限制。比如: 1)商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制&am…

正确的清理内存方式,才能让你的空间更加充裕

我们的手机用了一段时间后,有没有感觉卡变了,运行速度也很慢?估计是手机内存不足造成的,今天就来教教大家如何快速清理空间。方法一:清除微信缓存文件 我们每天都用微信。 其实它最占内存,我们还需要定时打…

原子化带来化学反应,视频号万粉创作者增加3倍,点赞10w+的爆款内容增长186%

1月10日,以“在场”为主题的2023微信公开课PRO正式开讲。本年度微信公开课重点从视频号内容生态发展、微信生态内各类产品助力实体转型以及数字生活服务升级三个方面,展示微信生态各产品的新能力、新计划。在2022年的微信公开课Pro上,“视频号…

广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”

文章目录广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”日志中心实时服务监控 —— 前链路日志分析日志收敛手段 —— “手术开口”基于 metrics 的日志分析 —— Prometheus & Graphite监控服务是怎么监控自身 & 比常规服务更坚强高扩展、高性能的架构设…

[L1 - 5分合集]心理阴影面积

L1-060 心理阴影面积 分数 5 作者 陈越 单位 浙江大学 题目: 这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由…

外贸邮件营销的优势

邮件营销相对于其他营销方式,历史更悠久。邮件营销具有成本低廉、快速、精准的特点。那么邮件营销有哪些优势,才能获得如此的关注。接下来,米贸搜和大家分享一下邮件营销的优势。1.节约成本的考虑:当前,世界经济复苏乏力&#xff…

Kafka消息队列使用及原理

消息队列作用:异步、削峰、解耦 1、kafka简介 ​ Apache Kafka 是一个分布式的流平台,有三个关键的功能: 能够发布(写入)和订阅(读取)事件流持续可靠的存储事件流在事件发生时回顾性的处理事件…

IB生物笔记:Structure and function of organelles

国际学校生物老师解读IB生物,感兴趣的同学记得收藏哦~IB生物分为SL(standard level)和HL(higher level)SL有6个topic∶细胞生物,分子生物,遗传学,生态学,物种进化以及多样性和人体生理。HL除了上述6个topic外还要加上∶…

C++模板类

目录 前言 类模板 模板类继承 前言 随着c发展,有一部分代码就会出现这样的情况:实现的内容相同,但是参数不同。模板类就是为解决这类情况来的,是一种泛型编码。即与数据类型无关的通用程序设计技术。 模板类本身不占空间&…

C语言模块化

🌞欢迎来到C语言的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误,…