首页 > 其他 > 详细

LockSupport分析

时间:2018-04-28 13:19:20      阅读:176      评论:0      收藏:0      [点我收藏+]

 

LockSupport是java.util.concurrent.locks包中的一个工具类,主要提供了一些在创建锁和同步类中用来阻塞其他线程的原始操作。

当有多个线程需要获取同一个资源的锁的时候,如果第一个线程已经获取了锁,则后面的线程需要阻塞等到前面的线程释放锁。

这个阻塞的操作就是通过LockSupport的park方法来实现的,而唤醒阻塞的线程则是通过LockSupport的unpark方法来实现的。

 

void park():阻塞当前线程,如果调用unpark(Thread thread)方法或则当前线程被中断,才能从park()方法返回。

vodi parkNanos(long nanos):阻塞当前线程,最长不超过nanos纳秒,返回条件在park()的基础上增加了超时返回。

void parkUntil(long deadline):阻塞当前线程,直到deadline时间(从1970年开始到deadline时间的毫秒数)

void unpark(Thread thread):唤醒处于阻塞状态的线程thread

class FIFOMutex {
   private final AtomicBoolean locked = new AtomicBoolean(false);
   private final 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(this);
       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());
   }
 }

 

LockSupport分析

原文:https://www.cnblogs.com/zerotomax/p/8966856.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!