【多线程学习六】Park和Unpark

本文深入探讨了LockSupport类中的park和unpark方法,这两个方法在多线程编程中用于线程的阻塞和唤醒。与wait/notify不同,park和unpark不需要配合对象监视器使用,提供更精确的线程控制。它们允许线程精确地暂停和恢复,而不是随机唤醒线程。此外,unpark可以在park之前调用,增加了灵活性。理解这些方法的工作原理对于优化并发代码至关重要。

Park&Unpark

LockSupport类的方法

// 暂停当前线程
LockSupport.park(); 
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)

特点

  • wait,notify,notifyAll必须配合Object monitor(重量级锁)一起使用,park和unpark则不需要
  • park和unpark以线程为单位进行【阻塞】和【唤醒】线程,而notify只能随机唤醒一个等待线程,notifyAll则是唤醒全部等待线程,相比较park和unpark就比较精准
  • park和unpark可以先unpark再park,而wait必须先执行才能执行notify/notifyAll

原理

每个线程都有一个专属的Parker对象,包含_counter, _cond, _mutex三部分

counter的值–》0耗尽,1充足

  • 调用park,检查_counter值

    • 当 __counter为0,获得_mutex互斥锁,线程进入 _cond条件变量阻塞,设置 _counter = 0
    • counter为1线程可继续前进

在这里插入图片描述

  • 调用unpark(thread-0),设置_counter = 1,

    • 唤醒__cond 条件变量中的thread-0线程,之后线程thread-0恢复运行,设置 _counter = 0

    • 当前线程调用park()方法,检查_counter ,值为1时线程无需阻塞,继续运行,设置 _counter = 0

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值