ReentrantLock 实现原理
创始人
2024-05-30 03:41:05
0

ReentrantLock 实现原理


ReentrantLock中依赖了AbstractQueuedSynchronizer 类来实现线程的同步,ReentrantLock的类关系图及依赖情况如图所示:
在这里插入图片描述
ReentrantLock 中定义了一个Sync的同步类,它有两个实现,一个是FairSync(公平同步),一个是NonfairSync(非公平同步),两者分别代表 ReentrantLock 中锁竞争的公平和非公平特性。而Sync同步类继承了AbstractQueuedSychronizer抽象类,对于排他锁的逻辑是在AbstractQueuedSynchronizer中完成的。

AbstractQueuedSynchronizer(AQS) 是ReentrantLock 实现锁同步的核心类,实际上在J.U.C 中大部分组件都依赖于 AbstractQueuedSynchronizer。
AQS中提供了如下两种锁的实现:

  • 独占锁,同一时刻只允许有一个线程获得锁。
  • 共享锁,同一时刻允许有多个线程同时获得锁。

AQS是一个抽象类,所以在使用时,我们需要继承该类,然后实现共享变量state的获取和释放,而AQS帮我们完成了线程等待队列的维护和唤醒,具体需要重写的方法:

  • tryAcquire(int) :独占方式。尝试获取资源,成功则返回true,失败则返回false。
  • tryRelease(int):独占方式。尝试释放资源,成果则返回true,失败则返回false。
  • tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余可用资源。
  • tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点则返回true,否则返回false。

以ReentrantLock 重入锁为例,互斥变量state初始值为0,表示未锁定状态。
如果线程t1调用lock()方法,则实际上会调用tryAcquire()方法将 state通过CAS修改为1。
此后,其他线程再调用tryAcquire()方法时就会失败,直到t1线程调用unlock()方法且 state=0之后,其他线程才有机会获得锁。
而t1线程在释放锁之前,可以重复获取该锁资源。
这个重复过程是基于state累加来统计的,这就是可重入的概念。
t1线程重入了多少次就需要释放多少次。

AbstractQueuedSynchronizer 基于排他锁的实现原理如下图所示:
在这里插入图片描述

相关内容

热门资讯

市值首次站上4万亿美元后,英伟... 英伟达的供应链遍布全球,在中国台湾,墨西哥、越南等多个国家及地区都有生产基地及市场。为了与中国市场保...
投资者提问:董秘你好,我觉得深... 投资者提问:董秘你好,我觉得深蓝和阿维塔产品都非常不错,但公司需要一个资深营销总监,把现在的销售团队...
特朗普遭未遂刺杀案:美特勤局6... 据美国广播公司(ABC)10日报道,一名美国官员证实,因在去年针对当时的总统候选人特朗普的未遂刺杀案...
拓斯达拟为润阳世纪光伏提供不超... 2025年7月11日,广东拓斯达科技股份有限公司发布关于向客户提供融资租赁回购担保的公告,拟为江苏润...
中国第一家保险公司的保单原来在... 转自:上观新闻今年的7月8日是第13个全国保险公众宣传日,由上海市保险学会、上海市保险同业公会联合策...
防溺水“压力山大”,南昌为何仍... 转自:半月谈 #南昌免费开放两滩七湾天然泳场# 【防溺水...
汽车行业今日净流出资金26.7... 沪指7月11日上涨0.01%,申万所属行业中,今日上涨的有19个,涨幅居前的行业为非银金融、钢铁,涨...
联合国设立“世界马日” 向人... 中新网北京7月11日电 据联合国新闻官网消息,今年的7月11日是联合国大会通过投票设立的首个“世界马...
Mhy20250711油脂晚评... (转自:南京玛合雅)一、【市场关注】1、北京时间7月10日(周四)中午12:30,马来西亚棕榈油局M...
25股股东户数连降 筹码持续集... 投资者可以在交易所互动平台上通过提问方式了解部分公司更及时(每月10日、20日、月末)的股东户数信息...