【juc】ReentrantLock的实现原理

目录

        • 1.说明
        • 2.锁的状态
        • 3.锁的实现方式
        • 4.AQS 的核心组件
        • 5.锁获取和释放的过程
          • 5.1 获取锁
          • 5.2 释放锁
        • 6.可重入性
        • 7.公平锁与非公平锁
        • 8.锁的中断响应

1.说明
  • 1.ReentrantLock 是 Java 中 java.util.concurrent.locks 包提供的一个可重入的互斥锁。
  • 2.它提供了与 synchronized 关键字类似的同步功能,但比 synchronized 更加灵活和强大。
  • 3.ReentrantLock 支持两种锁模式:公平锁非公平锁
2.锁的状态
  • 1.ReentrantLock 内部维护了一个锁的状态,用于表示锁是否被某个线程持有,以及被持有的次数。
  • 2.锁的状态通常用一个整数(通常是32位)来表示,其中高位的几位用于表示锁的状态,低位的几位用于记录重入的次数(即同一个线程持有锁的次数)。
3.锁的实现方式
  • 1.ReentrantLock 的实现依赖于底层的同步机制,如 AbstractQueuedSynchronizer(简称 AQS)。AQS 是一个用于构建锁或其他同步组件的框架,它定义了一套多线程访问共享资源的同步器。
4.AQS 的核心组件
  • 1.同步队列(Sync Queue):一个FIFO队列,用于存储等待获取锁的线程。
  • 2.状态字段(State):一个整数,用于表示锁的状态和重入次数。
  • 3.独占模式(Exclusive Mode):ReentrantLock 在默认情况下是独占锁,即一次只能有一个线程持有锁。
5.锁获取和释放的过程
5.1 获取锁
  • 1.尝试获取锁:当一个线程尝试获取锁时,它会首先尝试通过CAS(Compare-And-Swap)操作将锁的状态从“未锁定”(0)修改为当前线程的ID(或其他表示锁持有的值)。如果CAS操作成功,则线程成功获取锁,并增加重入次数。
  • 2.加入同步队列:如果CAS操作失败(即锁已被其他线程持有),则当前线程会被封装成一个节点(Node),并加入到同步队列的尾部。线程会进入一个自旋状态,不断尝试通过CAS操作获取锁,或者通过 park 方法挂起自己,等待被唤醒。
5.2 释放锁
  • 1.减少重入次数:当持有锁的线程释放锁时,它会首先减少重入次数。如果重入次数变为0,则锁的状态会被设置为“未锁定”。
  • 2.唤醒后继节点:如果锁状态变为“未锁定”,则持有锁的线程会唤醒同步队列中的下一个等待线程,使其有机会尝试获取锁。
6.可重入性
  • 1.ReentrantLock 是可重入的,这意味着同一个线程可以多次获取同一个锁而不会导致死锁。
  • 2.这是通过维护一个重入次数来实现的。
  • 3.每次线程获取锁时,重入次数加1;每次释放锁时,重入次数减1。
  • 4.只有当重入次数为0时,锁才会真正被释放。
7.公平锁与非公平锁
  • 1.公平锁:按照线程请求锁的顺序来分配锁,即先请求的线程先获得锁。这通常会导致较长的等待时间,但可以避免线程饥饿。
  • 2.非公平锁:不保证线程获取锁的顺序,可能会允许插队。这通常会导致较短的等待时间,但可能会导致线程饥饿。
8.锁的中断响应
  • 1.ReentrantLock 支持中断响应的锁获取操作。如果线程在尝试获取锁时被中断,它可以立即响应中断,而不是一直等待下去。

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

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

相关文章

Java开发人员学习ArkTs笔记(二)-函数与类

大家好,我是一名热爱Java开发的开发人员。目前,我正在学习ARKTS(Advanced Java Knowledge and Technology Stack),并将不断输出我的学习笔记。我将在这里分享我学习ARKTS的过程和心得,希望能够为其他开发人…

maven环境搭建

maven基本知识 https://blog.csdn.net/qq_41187116/article/details/125955085?spm1001.2014.3001.5502 maven环境搭建 maven软件下载 不要去官网下,慢~ 直接相信清华大学吧: https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.9/bin…

jmeter常用配置元件介绍总结之线程组

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之线程组 1.线程组(用户)1.1线程组1.1.setUp线程组和tearDown线程组1.2.Open Model Thread Group(开放模型线程组)1.3.bzm - Arrivals Thread Group(到达线程组)1.4.jpgc - Ultimate Thread Group(终极线程组)1.5.jpgc - St…

八 Bean的生命周期

八、Bean的生命周期 8.1 什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的销毁等。 所谓的生命周期就是:对象从创建开始到最终销毁的整个过程。 什么时候创建Bean对象? 创建Bean对象的前后会调用什…

【入门篇】桃园结义【算法赛】——多语言版

题目跳转 python import os import sys# 请在此输入您的代码 print(3)C #include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]) {printf("%d",3);return 0; }C #include <iostream> using namespace std; int main() {// …

速看!!!24下软考系统分析师综合知识真题回忆,考点已更新

2024下半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的系统分析师真题及答案&#xff0c;总共30道题左右。 下半年考试的宝子们可以对答案预估分数&#xff01;准备明年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff…

HarmonyOS NEXT:模块化项目 ——修改应用图标+启动页等

涉及官方文档 应用配置文件应用/组件级配置图标资源规范 涉及到app.json5配置文件和module.json5配置文件 1、 icon和label的校验。 IDE从5.0.3.800版本开始&#xff0c;不再对module.json5中的icon和label做强制校验&#xff0c;因此module.json5与app.json5只需要选择其一…

dolphinscheduler

dolphinscheduler 官网地址&#xff1a; https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/about/hardware 1. 概念&#xff1a;dolphinscheduler是一个功能强大的开源调度系统&#xff0c;专为管理和调度大规模数据处理任务设计。 2. 特点&#xff1a; 分布式架构、支持…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 吐血售&#xff01;聚划算&#xff01;Transforme…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C 个人主页&#xff1a;Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

Maven 构建项目

Maven 是一个项目管理和构建工具&#xff0c;主要用于 Java 项目。它简化了项目的构建、依赖管理、报告生成、发布等一系列工作。 构建自动化&#xff1a;Maven 提供了一套标准化的构建生命周期&#xff0c;包括编译、测试、打包、部署等步骤&#xff0c;通过简单的命令就可以执…

在jquery里,使用$.each()函数循环数组,对象,dom的用法

介绍 $.each() 能遍历一维数组&#xff0c;多维数组&#xff0c;JSON对象&#xff0c;dom2元素。在开发中可以很高效的处理各种数据结构。前提&#xff0c;需要导入jquery 使用 遍历JSON对象 var objDemo {name: linda,age:12, desc: a girl};$.each(objDemo,function(i,va…

UniApp 应用、页面与组件的生命周期详解

UniApp 应用、页面与组件的生命周期详解 在uni-app中包含了 应用生命周期、页面生命周期、和组件生命周期&#xff08; Vue.js的&#xff09;函数。 应用生命周期 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 <script>export default {onLaunc…

进程的创建/终止/等待/替换

目录 一、进程创建 &#xff08;一&#xff09;fork函数的概念 &#xff08;二&#xff09;fork函数示例 二、进程终止 &#xff08;一&#xff09;退出码的概念 &#xff08;二&#xff09;退出码的含义 &#xff08;三&#xff09;相关函数和指令 三、进程等待 &…

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

CANoe导入CAN DataBase(DBC文件)

Canoe是一款用于汽车网络仿真和开发的工具&#xff0c;它支持导入DBC文件&#xff08;CAN Database文件&#xff09;以定义和配置CAN网络中的消息、信号和节点。 将DBC文件拷贝至我们的工程目录的DBC文件夹内&#xff0c;随后在Simulation Setup中右击DataBase&#xff0c;进…

nacos配置管理

1、增加依赖 <!--配置管理的依赖 --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.1.0.RELEASE</version> </dependency><de…

每日OJ题_牛客_奇数位丢弃_找规律/模拟_C++_Java

目录 牛客_奇数位丢弃_找规律/模拟 题目解析 C代码1模拟 C代码2找规律 Java代码找规律 牛客_奇数位丢弃_找规律/模拟 奇数位丢弃_牛客题霸_牛客网 描述&#xff1a; 对于一个由 0..n 的所有数按升序组成的序列&#xff0c;我们要进行一些筛选&#xff0c;每次我们丢弃去…

解决table下tr或td选中不生效的问题

目录 一、问题描述 1.首先我们来看一下代码结构 2.检查代码&#xff08;鼠标右键或按下F12&#xff09; 3.解决方案 一、问题描述 解决table下tr或td选中不生效&#xff0c;页面刷新无效果 1.首先我们来看一下代码结构 这里我们的结构是table标签下的tr&#xff0c;tr当…

学籍拍照助手,中小学新生学籍证件照电脑端拍照教程

新学期过半&#xff0c;许多中小学学籍管理员都忙碌起来&#xff0c;为孩子们准备学籍所需的证件照。传统的照相馆拍摄、向家长收集都存在一些弊端&#xff0c;下面就来介绍如何使用校园学籍拍照助手&#xff0c;更智能的完成学籍证件照的拍摄。 1. 准备工作在开始之前&#xf…