JUC(1): LockSupport工具类

LockSupport工具类(底层调用了 Unsafe 类):

  • LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程

    • Lock Support是一个线程阻 塞工具类,有静态方法,LockSupport调用的Unsafe中的native代码。
    • Lock Support提供park()unpark() 方法实现在随意位置阻塞线程解除线程阻塞的过程(不必在同步代码块中)
    • 当调用 unpark(), 获取permit(为指定线程提供一块免死金牌)
    • 当调用 park() 阻塞时:
      • 若有凭证permit,消耗掉permit直接正常退出
      • 若无凭证permit,阻塞等待 unpark() 获取permit。
    • 注意:每个线程都有一个相关的通行证(permit), permit最多只有一个, 重复调用unpark()也不会积累凭证。
    • permit(许可)只有两个值1和0,默认是0。0 是阻塞,1是唤醒。可看成是一种(0,1)信号量(Semaphore),许可的累加上限是1。
  • LockSupport.park( ) 和 unpark( ) 和 object.wait( ) 和 notify( ) 的区别?

    • wait & notify 、notifyAll 必须配合锁 ObjectMonitor 使用,而park & unpark 不必。
    • park & unpark 是以线程为单位来【阻塞】和【唤醒】,notify 则是随机唤醒一个等待的线程,notifyAll 是唤醒所有等待线程,不精确。
    • park & unpark 可以先 unpark,而wait & notify 不能先 notify
    • 两者的阻塞队列并不交叉。object.notifyAll()不能唤醒LockSupport的阻塞Thread。
    • 暂停线程的机制也不一样,wait( ) 是让线程在monitor 的 waitSet 中等待,而LockSupport 是与被park的线程的互斥量进行控制。
    • park 和 unpark 的使用不会出现死锁的情况

三种阻塞线程的方法总结:

  • 使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程,成对出现使用!
  • 使用JUC包中Conditionawait()方法让线程等待,使用signal()方法唤醒线程,先await后signal,不能反了
  • LockSupport工具类中的park()unpark() 方法,实现在随意位置阻塞线程解除线程阻塞的过程(不必在同步代码块中)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值