LockSupport源码分析

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

关于sun.misc.Unsafe的说明请参见我的另外一篇博客。

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

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

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

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

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

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

posted on 2019-05-07 18:06  砌码匠人  阅读(148)  评论(0编辑  收藏  举报

导航