j.u.c包的Lock实现了synchronized同步的功能,同样await()和signal()实现了wait()和notiffy()一样的等待、通知的功能。一个简单的等待、通知流程(我们让thread1先执行)
说说锁的状态怎么变化的。
第一步:thread1获取到锁,state 0->1 (thread2因为获取不到锁会被阻塞)
第二步:调用await()方法线程会释放锁state 1 -> 0,然后线程被阻塞(调用park()方法),当然这里await()方法还没有执行完。
第三步:thread2获取到锁 state 0 -> 1
第四步:唤醒线程thread1。state状态没有变化 。
第五步:thread1从park()方法处返回,thread1可以继续运行了,但是它还不能从await()方法返回,因为这时候锁还在thread2手中,暂时还不能从await()方法返回,调用acquireQuered()来不断获取锁。。
第六步:thread2释放锁 state 1->0
第七步:能执行到这说明第五步已经获取到锁了(state 0 -> 1),thread1释放锁1->0
站在api层面有点地方不是很好理解,最好的办法就是深入源码看看细节。有不对的地方欢迎指正。