JavaTM 2 Platform
Standard Ed. 5.0

java.util.concurrent.locks
类 LockSupport

java.lang.Object
  继承者 java.util.concurrent.locks.LockSupport

public class LockSupport
extends Object

用来创建锁定和其他同步类的基本线程阻塞原语。

此类与每个使用它的线程关联,这是一种许可(从 Semaphore 类的意义上说)。如果该许可可用,并且可在进程中使用,则调用 park 将立即返回;否则可能 阻塞。如果许可尚不可用,则可以调用 unpark 使其可用。(但与 Semaphore 不同的是许可不能累积。最多只能有一个。)

parkunpark 方法提供了阻塞和解除阻塞线程的有效方法,并且不会遇到导致不被赞成的方法 Thread.suspendThread.resume 因为以下目的变得不可用的问题:由于许可的存在,调用 park 的线程和另一个试图将其 unpark 的线程之间的竞争将保持活性。此外,如果调用方线程被中断,并且支持超时,则 park 将返回。park 方法还可以在其他任何时间“无缘无故”地返回,因此通常必须在复查返回条件的循环里调用此方法。从这个意义上说,park 是“忙碌等待”的一种优化,并且不会浪费这么多的时间进行自旋,但是必须将它与 unpark 配对使用才更高效。

这些方法用作创建更高级的同步实用程序的工具,其本身对于大多数并发控制应用程序没有用处。

示例用法。 以下是一个先进先出非重入锁定类的概述。

 class FIFOMutex {
   private AtomicBoolean locked = new AtomicBoolean(false);
   private Queue<Thread> waiters = new ConcurrentLinkedQueue<Thread>();

   public void lock() { 
     boolean wasInterrupted = false;
     Thread current = Thread.currentThread();
     waiters.add(current);

     // Block while not first in queue or cannot acquire lock
     while (waiters.peek() != current || 
            !locked.compareAndSet(false, true)) { 
        LockSupport.park();
        if (Thread.interrupted()) // ignore interrupts while waiting
          wasInterrupted = true;
     }

     waiters.remove();
     if (wasInterrupted)          // reassert interrupt status on exit
        current.interrupt();
   }

   public void unlock() {
     locked.set(false);
     LockSupport.unpark(waiters.peek());
   } 
 }
 


方法摘要
static void park()
          出于线程调度目的禁用当前线程,除非许可可用。
static void parkNanos(long nanos)
          在到达指定的等待时间前,出于线程调度目的,将禁用当前线程,除非许可可用。
static void parkUntil(long deadline)
          在指定的最后期限之前,出于线程调度目的,将禁用当前线程,除非许可可用。
static void unpark(Thread thread)
          如果给定线程的许可尚不可用,则使其可用。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法详细信息

unpark

public static void unpark(Thread thread)
如果给定线程的许可尚不可用,则使其可用。如果线程之前在 park 上受阻塞,则它将解除其阻塞状态。否则,保证下一次调用 park 将不会受阻塞。如果给定线程尚未启动,则根本无法保证此操作是有效的。

参数:
thread - 要执行 unpark 操作的线程,或者该参数为 null(在这种情况下此操作无效)。

park

public static void park()
出于线程调度目的禁用当前线程,除非许可可用。

如果许可可用,则使用该许可,并且调用立即返回;否则,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一以前,该线程将一直处于休眠状态:

此方法并 报告是哪个线程导致该方法返回。调用方应该复查最先导致线程停止的条件。例如,调用方也可以确定线程返回时的中断状态。


parkNanos

public static void parkNanos(long nanos)
在到达指定的等待时间前,出于线程调度目的,将禁用当前线程,除非许可可用。

如果许可可用,则使用该许可,并且该调用立即返回;否则,出于线程调度目的,将禁用当前线程,并且且在发生以下四种情况之一以前,该线程将一直处于休眠状态:

此方法并 报告是哪个线程导致该方法返回。调用方应该复查最先导致线程停止的条件。例如,调用方也可以确定线程返回时的中断状态或所用的时间。

参数:
nanos - 要等待的最长毫微秒数

parkUntil

public static void parkUntil(long deadline)
在指定的最后期限之前,出于线程调度目的,将禁用当前线程,除非许可可用。

如果许可可用,则使用该许可,并且调用立即返回;否则,出于线程调度目的,将禁用当前线程,并且在发生以下四种情况之一以前,该线程将一直处于休眠状态:

此方法并 报告是哪个线程导致该方法返回。调用方应该复查最先导致线程停止的条件。例如,调用方也可以确定线程返回时的中断状态或当前时间。

参数:
deadline - 要等待的绝对时间,用相对于历元的毫秒数值表示

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策