深入理解AQS底层源码(二)——lock.unlock()

接着上一次线程2和线程3park后,需要unpark()唤醒。

第一步:线程1执行完成后,调用lock.lock()方法,实际调用的是sync.release(1)方法;

深入理解AQS底层源码(二)——lock.unlock()

第二步:线程1调用底层的release(int arg)方法,走到tryRelease(arg)方法;

getState() = 1,因为之前线程1加锁后state设值为1,它也是volatile修饰的。

Thread.currentThread() = 线程1,c = 0,free = true,setState(0),返回true。

深入理解AQS底层源码(二)——lock.unlock()

第三步:条件 = true,进入if代码块。head为哨兵节点也就是空节点,waitStatus = -1(前面设值过)。

深入理解AQS底层源码(二)——lock.unlock()

执行到unparkSuccessor(h),statue被设值为0,s = 哨兵节点的尾节点 = 线程2的节点,waitStatus = -1,走LockSupport.unpark(s.thread),线程2被唤醒。

深入理解AQS底层源码(二)——lock.unlock()