LockSupport
- 基本线程阻塞原语
LockSupport
中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。 因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。
1. 源码解读
1 | private LockSupport() {} //私有构造函数,无法被实例化 |
1.1 成员变量
1 | private static final sun.misc.Unsafe UNSAFE; //UnSafe对象 |
1.2 核心方法
1.2.1 park()
三种形式的park()还各支持一个blocker对象参数,即有没有设置线程的parkBlocker字段
1 | //阻塞当前线程,在阻塞当前线程的时候做了记录当前线程等待的对象操作 |
线程可重新运行的情况:
- 其他某个线程将当前线程作为目标调用
unpark
- 其他某个线程中断当前线程
interrupt()
- 该调用不合逻辑地(即毫无理由地)返回
wait()
和 park()
的区别在于:
wait()
阻塞线程前,必须通过synchronized
获取同步锁- 更加灵活。使用
park/unpark
,不会造成由wait/notify
调用顺序不当所引起的阻塞
1.2.2 unpark(Thread thread)
1 | //解除阻塞线程 |