• LockSupport分析


    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());
       }
     }
  • 相关阅读:
    渐变的圆
    画一组同心圆
    画五角星
    照猫画虎求阶乘
    字符串逆序输出
    格式化输出
    计算矩形面积
    字符串反码A
    快乐数字
    Maratona Brasileira de Popcorn( 二分答案+暴力 )
  • 原文地址:https://www.cnblogs.com/zerotomax/p/8966856.html
Copyright © 2020-2023  润新知