上一篇中,我们讲了 AbstractQueuedSynchronizer 的使用,链接为 Java 并发编程之AbstractQueuedSynchronizer解析 ,这一节中,我们将会从源码的角度解读:
一、双向链表:
AbstractQueuedSynchronizer中使用了双向链表来作为同步器的队列,来保证FIFO。
双向链表,首先会有一个header与tail的指针,这个不是节点,而是指针,header指向第一个节点,即Node1,所以 header == node1 。
其次各个节点之间会有pre与next指针。
二、获取锁:
下面将以Thread1获取到锁,Thread2接着获取锁,然后Thread2被阻塞,Thread1执行完成后,调用release()方法,接着Thread2获取到锁的例子来讲。
首先看之前需要明确,compareAndSetState, compareAndSetHead(设置AbstractQueuedSynchronizer中的头结点