https://blog.csdn.net/opensure/article/details/53349698
https://my.oschina.net/adan1/blog/159371
1 java 线程阻塞和唤醒的两种手段
对于线程的唤醒和阻塞,jdk提供了如下两种手段:
- Object类的wait和notify;
- LockSupport park()和unpark();
LockSupport使用方式和wait/notify很类似,LockSupport使用更加灵活,unpark可以先于park进行调用,因为这个特点,我们可以不用担心挂起和恢复时序问题,就如流打开了必须关闭这中类似问题,给我们带来很多编程麻烦。
2 LockSupport主要接口
LockSupport的主要接口是park和unpark,其底层是调用的UNSAFE接口的jni函数park和unpark;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFUF047Y-1570753708525)(assets/1568012648998.png)]
具体代码实现如下所示:
public static void park() {
UNSAFE.park(false, 0L);
}
public static void unpark(Thread thread) {
if (thread != null)
UNSAFE.unpark(thread);
}
public static void parkNanos(long nanos) {
if (nanos > 0)
UNSAFE.park(false, nanos);
}
3 LockSupport额外功能
LockSupport除了提供的阻塞和唤醒线程功能外,还提供了一些额外的功能总结如下:
- 为ThreadLocalRandom随机生成数字;
- 缓存调用park调用者,便于问题定位;
4 总结
LockSupport有以下不同和特点:
- 其实现机制和wait/notify有所不同,面向的是线程;
- 不需要依赖监视器;
- 与wait/notify没有交集;
- 使用起来更加灵活方便;