LockSupport 使用说明

LockSupport 使用说明

在看JUC包下源码时发现很多的线程的阻塞运行都通过park方法和unpark方法控制,尤其在看AQS源码时发现很多地方都会用到此类 ,首先我们通过api文档简单了解下该类
一下为api文档节选

  • 线程阻塞原语用于实现锁和用于实现同步类
  • 该类持有一个permit可供任意线程使用,permit只有0,1两种状态,park操作将permit从1变为0,unpark与之相反
  • park与unpark不会像Thread.suspend方法和Thread.resume方法出现死锁问题
  • park提供blocker对象参数用于问题定位

以AQS源码中为例此方法支持中断判断,例如可重入锁中支持中断的加锁方式在当前线程被中断唤醒后如果检查中断标识位为true可以抛出中断异常

private final boolean parkAndCheckInterrupt() {
    LockSupport.park(this);
    return Thread.interrupted();
}

该类提供了带有超时时间的park方法针对忙则等待的一种优化,park与unpark方法只是将线程睡眠和唤醒而不释放锁

重要方法分析

unpark将permit由0变为1当前线程由block状态变为unblock状态。

public static void unpark(Thread thread) {
    if (thread != null)
       UNSAFE.unpark(thread);
}

park方法将permit由1变为0阻塞当前线程除非一下三种情况发生否则一直阻塞

  • 其他线程调用unpark方法unblock该线程
  • 该线程被其他线程中断。
  • 该调用不合逻辑地(即毫无理由地)返回
public static void park(Object blocker) {
     Thread t = Thread.currentThread();
     setBlocker(t, blocker);
     UNSAFE.park(false, 0L);
     setBlocker(t, null);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值