LockSupport源码分析

LockSupport提供park()和unpark()方法实现线程阻塞和唤醒。底层实现是经过sun.misc.Unsafe的park和unpark。线程

关于sun.misc.Unsafe的说明请参见个人另一篇博客。对象

核心就是经过一个信号量(permit)实现的,0阻塞,1继续执行。博客

park时能够指定blocker以及阻塞时长或者阻塞到什么时间点,经过UNSAFE.park第一个boolean参数决定,true指定时间,false指定时长。it

能够先执行unpark,再执行part的时候发现以前unpark设置为1了,直接继续执行,并设置信号量为0。io

park时除了unpark或者时间到了的状况外,阻塞的线程也会被其余线程调用该线程的interrupt方法中断并当即返回,thread

该过程不会抛出异常,因此调用者须要检查线程状态,是怎样的方式被唤醒的。sed

park的注释说明以下:方法

This method does <em>not</em> report which of these caused the
 method to return. Callers should re-check the conditions which caused
 the thread to park in the first place.异常

 

与wait的区别:注释

wait须要获取对象锁,LockSupport不须要;

wait挂起的是当前线程,属于随机性,唤醒notify,notifyAll也是随机的,LockSupport直接控制的是线程,指定线程park,指定线程unpark或interrupt

相关文章
相关标签/搜索