深入理解AQS底层源码(二)——lock.unlock()
接着上一次线程2和线程3park后,需要unpark()唤醒。
第一步:线程1执行完成后,调用lock.lock()方法,实际调用的是sync.release(1)方法;
第二步:线程1调用底层的release(int arg)方法,走到tryRelease(arg)方法;
getState() = 1,因为之前线程1加锁后state设值为1,它也是volatile修饰的。
Thread.currentThread() = 线程1,c = 0,free = true,setState(0),返回true。
第三步:条件 = true,进入if代码块。head为哨兵节点也就是空节点,waitStatus = -1(前面设值过)。
执行到unparkSuccessor(h),statue被设值为0,s = 哨兵节点的尾节点 = 线程2的节点,waitStatus = -1,走LockSupport.unpark(s.thread),线程2被唤醒。