聊聊 ReentrantLock 吧
ReentrantLock 意为「可重入锁」,说起 ReentrantLock 就不得不说 AQS ,因为其底层就是「使用 AQS 去实现」的。
ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。
-
公平模式下等待线程入队列后会严格按照队列顺序去执行
-
非公平模式下等待线程入队列后有可能会出现插队情况
「公平锁」
-
第一步:「获取状态的 state 的值」
-
如果 state=0 即代表锁没有被其它线程占用,执行第二步。
-
如果 state!=0 则代表锁正在被其它线程占用,执行第三步。
-
-
第二步:「判断队列中是否有线程在排队等待」
-
如果不存在则直接将锁的所有者设置成当前线程,且更新状态 state 。
-
如果存在就入队。
-
-
第三步:「判断锁的所有者是不是当前线程」
-
如果是则更新状态 state 的值。
-
如果不是,线程进入队列排队等待。
-
「非公平锁」
-
获取状态的 state 的值
-
如果 state=0 即代表锁没有被其它线程占用,则设置当前锁的持有者为当前线程,该操作用 CAS 完成。
-
如果不为0或者设置失败,代表锁被占用进行下一步。
-
-
此时「获取 state 的值」
-
如果是,则给state+1,获取锁
-
如果不是,则进入队列等待
-
如果是0,代表刚好线程释放了锁,此时将锁的持有者设为自己
-
如果不是0,则查看线程持有者是不是自己
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了