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 基于排他锁的实现原理如下图所示:
在这里插入图片描述

相关内容

热门资讯

吃葡萄可以补充什么 吃葡萄可以补充什么葡萄性平,味甘酸,无毒,被中医为补血佳品。常食葡萄对神经衰弱和疲劳过度均有良效。它...
张家辉版的电视剧唐伯虎点秋香中... 张家辉版的电视剧唐伯虎点秋香中秋香是谁演的关咏荷,张家辉的老婆金装四大才子中张家辉演唐伯虎,关咏荷演...
复古睡衣装扮下的欧阳娜娜,是不... 复古睡衣装扮下的欧阳娜娜,是不是像个轻熟女?我觉得不像,是因为她年龄比较小,然后给人的感觉又非常的清...
《你不知道的事》这首歌的背景故... 《你不知道的事》这首歌的背景故事这首歌是王力宏导演兼领衔主演的电影《恋爱通告》内的主打歌,这些画面都...
限时用英语怎么说 限时用英语怎么说....time limit期限;限期set time limit,设定时间限制ti...
宝马730中文说明书 宝马730中文说明书没有车更没有说明书这个是真没有。
圣甲虫的品质和精神 圣甲虫的品质和精神 圣甲虫从不因为别人的三言两语而放弃,它永远走在自己认为对的道路上,不管别人说什么...
荣万家“两害取轻” 关联方再以... (转自:观点网)观点网 6月18日,在这个全民狂欢购物的日子里,荣万家也“买”了一大堆资产。当天,该...
守正创新 博采众长——专家共话... 原标题:守正创新 博采众长——专家共话如何建设世界一流科技期刊◎本报记者 张盖伦“中国科技期刊近年来...
全省电商产业发展促进就业创业活... 本报临夏讯(新甘肃·甘肃日报记者李永萍)6月16日至17日,省人社厅联合省发展改革委、省教育厅、省农...