jdk源码02-阻塞线程的另一种手段-LockSupport

https://blog.csdn.net/opensure/article/details/53349698

https://my.oschina.net/adan1/blog/159371

1 java 线程阻塞和唤醒的两种手段

对于线程的唤醒和阻塞,jdk提供了如下两种手段:

  1. Object类的wait和notify;
  2. 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除了提供的阻塞和唤醒线程功能外,还提供了一些额外的功能总结如下:

  1. 为ThreadLocalRandom随机生成数字;

在这里插入图片描述

  1. 缓存调用park调用者,便于问题定位;

4 总结

LockSupport有以下不同和特点:

  1. 其实现机制和wait/notify有所不同,面向的是线程;
  2. 不需要依赖监视器;
  3. 与wait/notify没有交集;
  4. 使用起来更加灵活方便;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值