heima并发---并发工具包(2)---reentrantLock--238
非公平锁的实现原理:
非公平锁的加锁流程。
---238---
当出现竞争的时候则:
进去:
注意凡是带try的都是只改变状态的。
尝试创建一个节点对象,并加入到等待队列。
等待队列是一个双向链表。
p是头节点,说明没有人和他竞争,就再获取一次。
失败了。是不是应该park住呢?
修改其前驱节点的waitStatus为-1。表示有责任唤醒其后继节点。每次添加都是把这个设置为-1。
再来:
阻塞住了。
---239---
看下解锁。
进入:
看下tryRelease
进入这个方法:
唤醒则在这里继续往下运行了。
成功了设置为头节点,原来的就断开了。
---240---
此时别忘了我们是非公平的锁。
---241---
可重入的原理。
获取锁:
解读这段代码:
正常获取。
重入就是增加计数器。
释放锁。不是0每次-1,是0,释放唤醒。
---242---
可打断的原理。
关于park:https://www.cnblogs.com/septemberFrost/p/12200755.html
我们知道线程如果一直没办法获取锁的话就会进入acquireQueued方法不断的进行尝试的。
如果一直尝试不到的话就进入parkAndcheckedAcquire方法。
此时其他的线程找到这个线程可以打断也就是终止这个park。走到红箭头,此时会清除打断标记,还可以park住。
再往下进入:
但是只是置为true,什么时候会用到呢?之后获得锁之久才会用到。
---
---243---
非公平锁。
公平锁:
---244---