LockSupport

LockSupport 提供了使线程阻塞或恢复阻塞的方法。

 

LockSupport.park 使当前线程进入阻塞状态。

LockSupport.unpark(Thread thread) 使参数指定的线程从阻塞状态进入可运行状态

 

park和unpark方法内部调用Unsafe类的本地方法实现了线程的阻塞与恢复。 

 

ReentrantLock  和 ReentrantReadWriteLock  内部使用 LockSupport  实现了线程阻塞的功能。

 

 

需要注意的是 LockSupport.park 使线程阻塞,未调用upark方法时,线程也有可能被唤醒,API中称为”park 方法还可以在其他任何时间“无缘无故”地返回,因此通常必须在复查返回条件的循环里调用此方法“

 

 

 

API中给出的示例 :

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)
          如果给定线程的许可尚不可用,则使其可用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值