LockSupport
LockSupport
为什么可以先唤醒后阻塞线程?
因为
unpark
获得了一个凭证,之后再调用park
方法,就可以名正言顺的凭证消费,不会阻塞。为什么唤醒两次后阻塞线程,但最终结果还会阻塞线程?
凭证的数量最多为1,连续调用多次
unpark
和调用一次一样,只会增加一个凭证,而调用park
需要消费两个凭证。
底层
调用了
unsafe
包下的native
方法。通过
permit
许可证来实现,线程的唤醒和阻塞。
线程阻塞和唤醒的方式
sychronized wait notify
lock await signal / signalAll
park unpark
说明:
wait,notify 需要在 sychronized 代码块中起作用.否则抛异常。
await signal / signalAll 需要在lock 锁住的代码块中,否则抛异常。
LockSupport 的park unpark 不需要