Lock Support 是一个非常方便的线程阻塞工具,他可以在线程内任意位置让线程阻塞。与 Thread.suspend() 方法相比,他补充了由于 resume( ) 方法发生导致线程无法继续执行的情况。和Object.wait( )相比,他不需要先获得对象的锁,也不会抛出InterruptedException异常。

LockSupport 静态方法

+ setCurrentBlocker( )
+ unpark( )
+ park( )
+ parkNanos( )
+ parkUntil( )
+ getBlocker( )
+ park( )
+ parkNanos( )
+ parkUntil( )
+ getThreadId( )

LockSupport 的静态方法 park( ) 可以阻塞当前线程,类似的还有 parkNanos( ) , parkUtil( ) 等方法。

LockSupport 的简易用法

下面是JDK中的先进先出的非可重入锁的简易示例代码:

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

   public void lock() {
     boolean wasInterrupted = false;
     // publish current thread for unparkers
     waiters.add(Thread.currentThread());

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

     waiters.remove();
     // ensure correct interrupt status on return
     if (wasInterrupted)
       Thread.currentThread().interrupt();
   }

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

   static {
     // Reduce the risk of "lost unpark" due to classloading
     Class<?> ensureLoaded = LockSupport.class;
   }
 }