heima并发---并发工具包(2)---reentrantLock--238

heima并发---并发工具包(2)---reentrantLock--238

非公平锁的实现原理:

非公平锁的加锁流程。

heima并发---并发工具包(2)---reentrantLock--238

heima并发---并发工具包(2)---reentrantLock--238

---238---

当出现竞争的时候则:

heima并发---并发工具包(2)---reentrantLock--238

进去:

heima并发---并发工具包(2)---reentrantLock--238

注意凡是带try的都是只改变状态的。

heima并发---并发工具包(2)---reentrantLock--238

尝试创建一个节点对象,并加入到等待队列。

等待队列是一个双向链表。

heima并发---并发工具包(2)---reentrantLock--238

p是头节点,说明没有人和他竞争,就再获取一次。

heima并发---并发工具包(2)---reentrantLock--238

失败了。是不是应该park住呢?

heima并发---并发工具包(2)---reentrantLock--238

修改其前驱节点的waitStatus为-1。表示有责任唤醒其后继节点。每次添加都是把这个设置为-1。

再来:

heima并发---并发工具包(2)---reentrantLock--238

阻塞住了。

---239---

看下解锁。

heima并发---并发工具包(2)---reentrantLock--238

进入:

heima并发---并发工具包(2)---reentrantLock--238

看下tryRelease

heima并发---并发工具包(2)---reentrantLock--238

进入这个方法:

heima并发---并发工具包(2)---reentrantLock--238

唤醒则在这里继续往下运行了。

heima并发---并发工具包(2)---reentrantLock--238

成功了设置为头节点,原来的就断开了。

---240---

此时别忘了我们是非公平的锁。

heima并发---并发工具包(2)---reentrantLock--238

heima并发---并发工具包(2)---reentrantLock--238

---241---

可重入的原理。

获取锁:

heima并发---并发工具包(2)---reentrantLock--238

解读这段代码:

heima并发---并发工具包(2)---reentrantLock--238

正常获取。

heima并发---并发工具包(2)---reentrantLock--238

重入就是增加计数器。

heima并发---并发工具包(2)---reentrantLock--238

释放锁。不是0每次-1,是0,释放唤醒。

---242---

可打断的原理。

关于park:https://www.cnblogs.com/septemberFrost/p/12200755.html

我们知道线程如果一直没办法获取锁的话就会进入acquireQueued方法不断的进行尝试的。

如果一直尝试不到的话就进入parkAndcheckedAcquire方法。

heima并发---并发工具包(2)---reentrantLock--238

此时其他的线程找到这个线程可以打断也就是终止这个park。走到红箭头,此时会清除打断标记,还可以park住。

heima并发---并发工具包(2)---reentrantLock--238

再往下进入:

heima并发---并发工具包(2)---reentrantLock--238

但是只是置为true,什么时候会用到呢?之后获得锁之久才会用到。

heima并发---并发工具包(2)---reentrantLock--238

---

heima并发---并发工具包(2)---reentrantLock--238

---243---

非公平锁。

heima并发---并发工具包(2)---reentrantLock--238

公平锁:

heima并发---并发工具包(2)---reentrantLock--238

heima并发---并发工具包(2)---reentrantLock--238

---244---