今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

LockSupport

概述

用于创建锁和其他同步类的基本线程阻塞基元。 
此类与使用它的每个线程关联一个许可证(在信号量类的意义上)。如果许可证可用,park调用将立即返回,并在此过程中消耗许可;否则可能会阻止。如果许可证尚不可用,则调用unpark即可获得许可证。(与信号量不同,许可证不会累积。最多有一个。)可靠的使用需要使用volatile(或原子)变量来控制何时park或unpark。对这些方法的调用的顺序是相对于volatile变量访问维护的,但不是必须的对于非volatile变量访问。方法park和unpark提供了有效的阻塞和取消阻塞线程的方法,这些线程不会遇到导致已弃用的方法Thread.susure和Thread.resume无法用于以下目的的问题:由于许可,一个调用park的线程和另一个试图unpark它的线程之间的竞争将保持活动状态。此外,如果调用方的线程中断,park方法将返回,并且支持超时版本。Park 方法也可以在任何其他时间返回,“无缘无故”,因此通常必须在返回时重新检查条件的循环中调用。从这个意义上说,park方法是“忙碌等待”的优化,不会浪费太多时间自旋,但必须与unpark配对才能有效。三种形式的公园还分别支持阻止程序对象参数。在线程被阻塞时记录此对象,以允许监视和诊断工具识别线程被阻塞的原因。(此类工具可以使用方法getBlocker(Thread)访问阻止程序。强烈建议使用这些表单,而不是没有此参数的原始表单。在锁实现中作为阻止程序提供的正常参数是这样的。这些方法旨在用作创建更高级别的同步实用程序的工具,并且它们本身对大多数并发控制应用程序没有用处。park方法设计仅用于形式的结构

while (!canProceed()) {
   // ensure request to unpark is visible to other threads
   ...
   LockSupport.park(this);
 }

在调用park之前,发布unpark请求的线程的任何操作都不会涉及锁定或阻止。由于每个线程只有一个许可证,因此对 park 的任何中间使用(包括隐式通过类加载)都可能导致线程无响应(“丢失的 unpark”)。

方法

  • park() 阻塞当前线程,指导发生一下情况时被唤醒:

  1. 其他线程以当前线程调用unpark方法
  2. 其他线程打断当前线程
  3. 虚假调用返回
  • parkNanos(long nanos) 与park一样,唤醒与之不一样的是多了一种,即等待特定的纳秒时间唤醒。nanos<=0时不执行任何操作

  • park(Object blocker) 可以设置blocker,在诊断问题时可以知道park的原因

  • parkUntil(long deadline) 阻塞当前线程,直到传的deadline时间

分享到:

专栏

类型标签

网站访问总量