《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
- 锁实现
- 锁使用
可重⼊意味着线程可进⼊它已经拥有的锁的同步代码块。
设计两个线程调⽤ call() ⽅法,第⼀个线程调⽤ call() ⽅法获取锁,进⼊ lock() ⽅法,由于初始 lockedBy 是 null,所以不会进⼊ while ⽽挂起当前线程,⽽是增量 lockedCount 并记录 lockBy 为第 ⼀个线程。
接着第⼀个线程进⼊ inc() ⽅法,由于同⼀进程,所以不会进⼊ while ⽽挂起,接着增量 lockedCount,当第⼆个线程尝试 lock,由于 isLocked=true, 所以他不会获取该锁,直到第⼀个线程调⽤两次 unlock() 将 lockCount 递减为 0,才将标记为 isLocked 设置为 false。
设计思路
假设锁的key为“lock”,hashKey是当前线程的id:“threadId”,锁自动释放时间假设为20。
获取锁
判断lock是否存在 EXISTS lock
-
不存在,则自己获取锁,记录重入层数为1.
-
存在,说明有人获取锁了,继续判