LockSupport

  • 时间:
  • 浏览:1
  • 来源:大发彩神APP_大发神彩APP官方

在《ReentrantLock详解》(地址:https://yq.aliyun.com/articles/4500711)中分析源码的以前,亲戚朋友 就本来 多次提到使用LockSupport的pack挂起系统任务管理器,unpack唤醒被挂起的系统任务管理器,此博客将详述LockSupport的原理以及实现。

以下是ReentrantLock中pack的使用代码

LockSupport是用于创建锁和一些同步类的阻塞原语。以下是jdk对LockSupport的描述。

从上面表格还还能否 看出,park支持blocker对象作为参数。此blocker对象在系统任务管理器受阻塞时被记录,那么 监视工具和诊断工具就还还能否 选泽系统任务管理器受阻塞的意味着。建议最好使用哪些地方地方带blocker的办法版本,而就有不带blocker参数的办法。

挂起与阻塞主要的区别应该说是它们面向的对象不同。对系统任务管理器来说, LockSupport的park/unpark更符合阻塞和唤醒的语义,亲戚朋友 以“系统任务管理器”作为办法的参数,语义更清晰,使用起来也更方便。而wait/notify使“系统任务管理器”的阻塞/唤醒对系统任务管理器四种 生活来说是被动的,要准确的控制哪个系统任务管理器、哪些地方以前阻塞/唤醒是很困难的,一些是要么随机唤醒一个多多多多系统任务管理器(notify)要么唤醒所有的(notifyAll)。

LockSupport通过许可(permit)实现挂起系统任务管理器、唤醒挂起系统任务管理器功能。还还能否 按照以下逻辑理解:

本来 系统任务管理器的permit不占据 ,那么释放一个多多多多permit。本来 有permit了,一些本来 系统任务管理器占据 挂起请况,那么此系统任务管理器会被系统任务管理器调度器唤醒。本来 系统任务管理器的permit占据 ,permit本来 会累加,看起来想哪些地方事都没做一样。注意这些点和Semaphore是不同的。

parkNanos(long)

和parkUntil(Object, long)累似 于,仅少了blocker相关的操作

park()

和parkNanos(Object, long)累似 于,仅少了blocker相关的操作

主要功能:

Basic thread blocking primitives for creating locks and other synchronization classes.

设置系统任务管理器许可为可用。

park(Object)

parkUntil(Object, long)

parkNanos(Object, long)

parkUntil(long)

LockSupport中pack有多个版本,如下所示:

指定了一个多多多多挂起时间(相对于当前的时间),时间到后自动被唤醒;累似 于50000纳秒后自动唤醒

指定一个多多多多挂起时间(绝对时间),时间到后自动被唤醒;累似 于2018-02-12 21点整自动被唤醒。

挂起当前系统任务管理器,具体见上面pack的源码分析

本来 系统任务管理器的permit占据 ,那么系统任务管理器不用被挂起,立即返回;本来 系统任务管理器的permit不占据 ,认为系统任务管理器缺少permit,一些还能否 挂起等待歌曲permit。

以下伪代码是pack的常用模型。

和park(Object)相比少了挂起前为系统任务管理器设置blocker、被唤醒后清理blocker的操作。

本来 许可占据 ,那么将这些许可使用掉,本来 立即返回。本来 许可不占据 ,那么挂起当前系统任务管理器,直到以下任意一件事情占据 :

park办法还还还能否 在一些任哪年间“毫无理由”地返回,本来 通常还能否 在重新检查返回条件的循环里调用此办法。从这些意义上说,park 是“忙碌等待歌曲”的四种 生活优化,它不用浪费那么多的时间进行自旋,本来 还能否 将它与unpark配对使用才更高效。

park和unpark办法不用突然出显Thread.suspend和Thread.resume的死锁问提。这是本来 许可的占据 ,调用park的系统任务管理器和那么 试图将其unpark的系统任务管理器之间的将那么竞争关系。此外,本来 系统任务管理器被中断本来 超时,则park将返回。