首页 > 其他分享 >ReentrantLock实现原理

ReentrantLock实现原理

时间:2023-10-14 10:01:53浏览次数:32  
标签:队列 实现 ReentrantLock 阻塞 获取 线程 公平 原理

ReentrantLock 是可重入的独占锁,只能有一个线程可以获取该锁,其它获取该锁的线程会被阻塞而被放入该锁的阻塞队列里面。

看看ReentrantLock的加锁操作:

// 创建非公平锁
ReentrantLock lock = new ReentrantLock();
// 获取锁操作
lock.lock();
try {
// 执行代码逻辑
} catch (Exception ex) {
// ...
} finally {
// 解锁操作
lock.unlock();
}

new ReentrantLock() 构造函数默认创建的是非公平锁 NonfairSync。

公平锁 FairSync

1. 公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁

2. 公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU 唤醒阻塞线程的开销比非公平锁大

非公平锁 NonfairSync

非公平锁是多个线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待。但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁

非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得锁,CPU 不必唤醒所有线程。缺点是处于等待队列中的线程可能会饿死,或者等很久才会获得锁

默认创建的对象lock()的时候:

如果锁当前没有被其它线程占用,并且当前线程之前没有获取过该锁,则当前线程会获取到该锁,然后设置当前锁的拥有者为当前线程,并设置 AQS 的状态值为1 ,然后直接返回。如果当前线程之前己经获取过该锁,则这次只是简单地把AQS 的状态值加1后返回。

如果该锁己经被其他线程持有,非公平锁会尝试去获取锁,获取失败的话,则调用该方法线程会被放入 AQS 队列阻塞挂起。

标签:队列,实现,ReentrantLock,阻塞,获取,线程,公平,原理
From: https://blog.51cto.com/u_16269508/7859061

相关文章

  • 抽象工厂模式--Java实现
    画类图用人的肤色和性别进行抽象工厂方法模式的实现,肤色和性别组成产品等级结构和产品族;具体代码实现项目结构://AbstractFactory.javapackageorg.example.design002;publicinterfaceAbstractFactory{publicMancreateMan();publicWomancreateWoman();}......
  • Redis分布式锁实现一直到Redis相关操作总结
    FreeRedis实现源码///<summary>///开启分布式锁,若超时返回null///</summary>///<paramname="name">锁名称</param>///<paramname="timeoutSeconds">超时(秒)</param>///<paramname="autoDelay">自动延长锁超时时......
  • python实现fasta文件碱基序列每行按照指定数目输出
     001、(base)[root@pc1test1]#lsa.fatest.py(base)[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggjjjcccjjjjjj>chr3ccc>chr4aaaaatt(base)[root@pc1test1]#cattest.py##程序#!/usr/bin/envpython3#......
  • python 实现统计fasta文件每一条序列的长度
     001、a、[root@pc1test1]#lsa.fatest.py[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggccc>chr3cccttt>chr4aaaaattt[root@pc1test1]#cattest.py##统计每条序列的长度#!/usr/bin/envpython3#-*-coding:......
  • 智慧矿山&矿山安全生产:AI算法实现矿山井下堆料检测
    在矿山行业中,堆料是一个重要的环节。堆料过程中,常常出现堆料不均匀、溢堆、重叠等问题,影响了生产效率和质量。传统的堆料检测方法耗时且不准确,无法满足井下作业的需求,因此需要一种智能化的堆料检测解决方案,这就是AI算法实现井下堆料检测的应用场景。AI算法技术在矿山行业中的应用日......
  • 深入了解基数排序:原理、性能分析与 Java 实现
    基数排序(RadixSort)是一种非比较性排序算法,它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。基数排序原理基数排序的基本原理是按照低位先排序,然后收集;再按照高位排序,再收集;以此类推,直到最高......
  • Linux实现虚拟机间跨网段通信
    Linux虚拟机跨网段通信目录:目录实验场景3实验环境3添加虚拟网络3配置VM1地址4配置R1地址5有网卡配置文件5如果没有网卡配置文件5配置R2地址7有配置文件7配置VM2地址8配置路由8开启R1路由转发功能8配置静态路由9开启R2路由转发9说明:9配置静态路由9验证10VM1pingV......
  • 关于实现垃圾分类检测系统的选题报告
    关于实现垃圾分类检测系统的选题报告目录关于实现垃圾分类检测系统的选题报告一、项目背景、意义及目标:(一)背景:(二)意义:(三)目标:二、可行性分析:(一)规模及难度:(二)人员:(三)成本预算:(四)时间要求:(五)风险:三、项目计划:(一)软件开发模型:瀑布模型(二)时间安排(三)人员分工:一、项目背景、意义及目标:(一)背景......
  • 工厂方法模式--Java代码实现
    1、画类图2、Java代码实现其中可知,PWFactory、PW类均为接口类;并且,DESFactory、IDEAFactory类均要实现PWFactory接口;DES、IDEA类均要实现PW接口;具体代码如下://PWFactory.javapackageorg.example;publicinterfacePWFactory{publicPWcreateProduce();}//DE......
  • 可实现加、减、乘、除、开平方的计算器软件的实验设计
    1、思路代码:#include<stdio.h>#include<math.h>//牛顿迭代法计算平方根doublesqrt_newton(doublex){doubleguess=x/2.0;//初始猜测值为x的一半doubledelta=0.000001;//误差范围while(fabs(guess*guess-x)>delta){guess=(guess+x/guess)/2.0;......