LockSupport线程阻塞器

LockSupport是Java中用于锁和同步的线程阻塞器,它解决了阻塞轮询问题并避免了Thread.suspend/resume的潜在风险。当调用park时,线程会被阻塞,而unpark则允许线程获取令牌并继续执行。park方法在中断、令牌持有或超时时会返回,不会抛出InterruptedException。与Thread.suspend/resume不同,LockSupport.park会使线程进入WAIT状态并释放资源。
摘要由CSDN通过智能技术生成

语义说明

  • 线程阻塞器,用于锁和同步场景。底层有个二元信号量(即1个牌),当持有令牌时,调用park会直接返回,否则阻塞。当执行unpark时,可以获取令牌。该类解决了阻塞轮询问题(busy wait)。
  • park(blocker)设置阻塞对象(实际写入Thread.parkBlocker属性),一般就用this即可,用于记录阻塞原因,可以通过getBlocker(Thread)获取
  • park返回方式有
    • Thread.interrupt()
    • unpark
    • 本身持有令牌
    • 超时/到时间parkUntil,并不会抛异常,而是直接返回
  • park不会抛出InterruptedException异常,当调用Thread.interrupt()后,park会直接返回,可以通过Thread.interrupted()判断是否被中断。

与Thread.suspend/resume区别

  • suspend调用后线程的状态依旧是RUNNABLE,且并不释放占用资源,如果在resume调用在suspend之前,那么线程会一直挂着,而且状态还是RUNNABLE,排查问题几乎不可能。
  • 2者不推荐使用。
  • LockSupport.park调用后,线程状态为WAIT,且释放占用资源,解决了busy wait问题和线程无法释放问题。

推荐范式

// 阻塞线
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值