语义说明
- 线程阻塞器,用于锁和同步场景。底层有个二元信号量(即1个牌),当持有令牌时,调用park会直接返回,否则阻塞。当执行unpark时,可以获取令牌。该类解决了阻塞轮询问题(busy wait)。
- park(blocker)设置阻塞对象(实际写入Thread.parkBlocker属性),一般就用this即可,用于记录阻塞原因,可以通过getBlocker(Thread)获取
- park返回方式有
- Thread.interrupt()
- unpark
- 本身持有令牌
- 超时/到时间parkUntil,并不会抛异常,而是直接返回
- park不会抛出InterruptedException异常,当调用Thread.interrupt()后,park会直接返回,可以通过Thread.interrupted()判断是否被中断。
与Thread.suspend/resume区别
- suspend调用后线程的状态依旧是RUNNABLE,且并不释放占用资源,如果在resume调用在suspend之前,那么线程会一直挂着,而且状态还是RUNNABLE,排查问题几乎不可能。
- 2者不推荐使用。
- LockSupport.park调用后,线程状态为WAIT,且释放占用资源,解决了busy wait问题和线程无法释放问题。
推荐范式
// 阻塞线