LockSupport 类:
https://www.matools.com/file/manual/jdk_api_1.8_google/java/util/concurrent/locks/package-frame.html
LockSupport 是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 中的park()
和 unpark()
的作用分别是阻塞线程和解除阻塞线程。
类中定义的静态方法:
- park:暂停线程执行,除非许可证可用。
- unpark:为给定的线程提供许可证(如果尚未提供)。恢复当前线程的运行。
线程等待唤醒方法:
- 使用 Object 中的
wait()
方法让线程等待,使用Object中的notify()
方法唤醒线程。 - 使用 JUC 包中的
Condition
的await()
方法让线程等待,使用signal()
方法唤醒线程。 - LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程。
LockSupport 等待唤醒机制:
通过park
和unpark(thread)
方法来实现阻塞和唤醒线程的操作。
permit 许可证在默认情况下时没有的,所以在调用了park()
方法之后,当前线程机会被暂停,直到别的线程给当前线程发放 permit 许可证之后(调用unpark(thread)
方法),处于暂停状态下的线程才会恢复执行。
调用了unpark(thread)
方法之后,会给 thread 线程发放 permit 许可证,会自动唤醒park
线程,即之前阻塞中的park()
方法会立即返回。
park / unpark 方法:
与java.lang.Object
类中定义的 wait
和notify
相比:
- wait,notify 和 notifyAll 必须配合 Object Monitor(Synchronized) 一起使用,而park 和 unpark 不需要
- park 和 unpark 是以线程为单位来 【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待的线程,notifyAll 是唤醒所有等待的线程,就不那么【精确】
- park 和 unpark 可以先 unpark,而 wait 和 notify 不能先 notify