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

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

被折叠的 条评论
为什么被折叠?



