Synchronized、ReentrantLock 和 ReadWriteLock底层原理

Synchronized 底层原理

1. JVM 层面的实现

  synchronized 是 Java 中的一个关键字,它提供了一种简单的策略来实现线程同步。在 JVM 层面,synchronized 可以依赖于对象内部的监视器锁(monitor lock)来实现同步。

  • 锁的获取与释放:当一个线程进入 synchronized 修饰的方法或代码块时,它会自动获取锁,退出时自动释放锁。
  • 对象头:Java 对象头中有一部分是用来实现锁的功能,称为 Mark Word。在运行时,Mark Word 中的信息会被用来存储锁的状态或者指向锁记录(Lock Record)的指针。
  • 锁的状态:锁可以处于无锁状态、偏向锁状态、轻量级锁状态或重量级锁状态。随着竞争的增加,锁可以升级,但不会降级。

2. 锁的升级过程

  • 偏向锁:当没有竞争出现时,默认开启偏向锁,它会偏向于第一个获取它的线程,减少之后的同步操作。
  • 轻量级锁:当有其他线程尝试获取已被偏向的锁时,偏向锁会升级为轻量级锁,此时线程会在对象头上的 Mark Word 中创建锁记录。
  • 重量级锁:当锁处于轻量级状态下,如果有更多线程加入竞争,轻量级锁会膨胀为重量级锁,此时线程会进入阻塞状态,等待操作系统的调度。

ReentrantLock 底层原理

1. Java API 层面的控制

  ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个类。它提供了比 synchronized 更丰富的锁操作功能。

  • 显式锁操作:使用 ReentrantLock 时,需要显示地调用 lock() 和 unlock() 方法来获取和释放锁。
  • 可重入性ReentrantLock 支持可重入,即同一个线程可以多次获得同一把锁。

2. AQS(AbstractQueuedSynchronizer)框架

  ReentrantLock 的实现依赖于 AQS,这是一个用于构建锁和其他同步组件的框架。

  • 状态变量:AQS 内部有一个整型的状态变量来表示锁的状态。
  • 节点队列:AQS 使用一个双向链表(称为 CLH 队列)来管理线程的排队工作。
  • 独占模式ReentrantLock 在 AQS 的基础上实现了独占模式,即任何时刻只有一个线程持有锁。

ReadWriteLock 底层原理

1. 分离读写操作

  ReadWriteLock 是一个接口,它的实现类(如 ReentrantReadWriteLock)允许多个线程同时读取,但只有一个线程可以写入。

  • 读锁和写锁ReadWriteLock 提供了两种锁:读锁(共享锁)和写锁(独占锁)。

2. 基于 AQS 实现

  ReentrantReadWriteLock 的实现也是基于 AQS,但是它使用了 AQS 的共享模式。

  • 状态变量的特殊使用:AQS 状态变量的高位表示写锁状态,低位表示读锁的数量。
  • 锁降级:支持写锁降级为读锁,即持有写锁的线程可以获取读锁,然后释放写锁,这在某些情况下可以减少锁竞争。

总结

  SynchronizedReentrantLockReadWriteLock 都是用于实现线程同步的机制,但它们的实现原理和适用场景有所不同。Synchronized 是基于 JVM 实现的内置锁机制,而 ReentrantLockReadWriteLock 是基于 Java API 层面,通过 AQS 框架来实现更复杂的锁操作和同步控制。

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

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

相关文章

GB/T 41480-2022 门和卷帘的防烟性能

门和卷帘的防烟是指在指定的试验温度、压差条件下,烟气从一侧泄露到另一侧的烟气泄露速率。 GB/T 41480-2022 门和卷帘的防烟性能样品要求 门或卷帘试件结构为非对称时,应对结构相对薄弱的一面进行测试,其中常温试验测试一个试件&#xff0…

如何购买腾讯云的服务器(详解腾讯云服务器购买流程)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动机,选择范围窄,但是…

YOLOv5-Lite 树莓派4B 15帧教程

【前言】 由于v5Lite仓库遗漏了不少历史问题,最大的问题是毕业后卷起来了,找不到时间更新。 上面是这篇博客的背景,那么先说下结论,使用 v5lite-e 模型,在 树莓派4B(4G内存) 上,有三…

PyTorch 进阶指南,10个必须知道的原则

PyTorch 是一种流行的深度学习框架,它提供了强大的工具和灵活的接口,使得开发者能够搭建和训练各种神经网络模型。这份指南旨在为开发者提供一些有用的原则,以帮助他们在PyTorch中编写高效、可维护和可扩展的代码。 如果你对 Pytorch 还处于…

树莓派界面改成中文

安装完树莓派系统(Raspberry Pi OS with Desktop),第一次启动时,时会有如下面二个图所示,让你选择区域时区和语言。 树莓派默认的语言为英文,如果你在安装时没有选择的话,默认的区域为英国,语言为英国英文&…

Python新手上路:“用Python和Pygame创造你的流星雨”

文章目录 一、前言二、下载安装过程1.官网下载安装包2.安装python过程第一步第二步第三步第四步第五步安装完成 3.简单测试Python3.1 检查 Python 版本号3.2 打开 Python 解释器3.3 输入你的第一个代码3.4 运行 Python 脚本 4.安装Pygame4.1 cmd命令安装Pygame4.2 pip升级4.3 安…

C++11特性:原子变量

C11提供了一个原子类型std::atomic<T>&#xff0c;通过这个原子类型管理的内部变量就可以称之为原子变量&#xff0c;我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数&#xff08;不支持浮点类型和复合类型&#xff09;。 原子指的是一系列不可被…

Flask 页面布局layout_main.html

Flask 页面布局layout_main.html 【源码来自编程浪子的flask点餐小程序】 web/templates/common/layout_main.html <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-wid…

应对微信小程序用户流失率的有效策略

随着移动互联网的发展&#xff0c;微信小程序已经成为许多企业和个人提供服务、产品的重要平台。然而&#xff0c;高用户流失率仍然是很多开发者面临的挑战之一。在这篇文章中&#xff0c;我们将讨论一些应对微信小程序用户流失率的有效策略&#xff0c;帮助开发者更好地留住用…

【C语言】程序练习(二)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 目录 前言 一、运算符练习 1 算术运算符 1.1 练习题&#xff1a; 2 自加自减运算符 3 关系运…

Python列表数据处理全攻略(三):常用内置方法轻松掌握

文章目录 引言Python列表常用内置方法count()功能介绍语法示例注意事项 index()功能介绍语法示例注意事项&#xff1a; insert()功能介绍语法示例注意事项总结 结束语 引言 亲爱的读者&#xff0c;你好&#xff01;Python的列表在数据结构中占据着核心地位&#xff0c;对于学习…

机器学习——损失函数

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、简介 损失函数(loss function)又称为误差函数(error function)&#xff0c;是衡量模型好坏的标准&#xff0c;用于估量模型的预测值与真实值的不一致程度&#xff0c;是一个…

基于SVM的冷却剂流量预测,基于支持向量机SVM的冷却剂流量预测

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接: 基于SVM的冷却剂流量预测,基于支持向量机SVM的冷却剂流量预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835…

java itext5 生成PDF并填充数据导出

java itext5 生成PDF并填充数据导出 依赖**文本勾选框****页眉**&#xff0c;**页脚****图片**实际图 主要功能有文本勾选框&#xff0c;页眉&#xff0c;页脚&#xff0c;图片等功能。肯定没有专业软件画的好看&#xff0c;只是一点儿方法。仅供参考。 依赖 <!--pdf-->&…

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)

为结构体自身时&#xff0c;用.调用成员变量&#xff1b;为结构体指针时&#xff0c;用->调用成员变量 所以存在结构体数组时&#xff0c;调用数组元素里的成员变量&#xff0c;就是要用. 结构体自身只有在new时才会创建出来&#xff0c;而其指针可以随意创建 在用new时&…

Android Security PIN 相关代码

开发项目遇到一个问题&#xff0c;具体描述及复制步骤如下&#xff1a; 就是开启"Enhanced PIN privacy"(增强的PIN隐私)的时候输入秘密的时候还是会显示数字 如下图&#xff0c;应该是直接是“.” 不应该出现PIN 密码 想要的效果如下图&#xff1a; 设置的步骤如下图…

RabbitMQ 和 Kafka 对比

本文对RabbitMQ 和 Kafka 进行下比较 文章目录 前言RabbitMQ架构队列消费队列生产 Kafka本文小结 前言 开源社区有好多优秀的队列中间件&#xff0c;比如RabbitMQ和Kafka&#xff0c;每个队列都貌似有其特性&#xff0c;在进行工程选择时&#xff0c;往往眼花缭乱&#xff0c;不…

Flask 账号详情展示

Flask 账号详情展示 这段代码是一个基于Flask框架的Python应用程序。 它包含了两部分代码&#xff1a;Python代码和HTML代码。 web/templates/common/tab_account.html <div class"row border-bottom"><div class"col-lg-12"><div cla…

多态-多态的基本概念-类和对象

多态的基本 #include<iostream> using namespace std; //动物类 class Animal { public:virtual void Speak(){cout << " 动物在噢噢叫" << endl;} }; //猫类 class Cat :public Animal { public:void Speak(){cout << "小猫在噢噢叫&…

C++系列-第3章循环结构-26-认识do-while语句

C系列-第3章循环结构-26-认识do-while语句 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 对于 while 语句而言&#xff0c;如果不满足条件&#xff0c;则不能进入循环。但有时候我们需要即使不满足条件&#xff0c;也至少执行一次。 do-while循环…