zoukankan      html  css  js  c++  java
  • 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());
       }
     }
  • 相关阅读:
    SQL Server 触发器
    T-SQL查询进阶-10分钟理解游标
    有关T-SQL的10个好习惯
    iOS 画虚线以及drawRect的使用总结:
    iOS一个for循环实现,几行 几列 的布局形式
    IOS 符合某类型的子视图批量从父视图中移除
    DESC 和 ASC
    把数组格式数据转换成字符串存入数据库
    Swift :?和 !
    Swift 类构造器的使用
  • 原文地址:https://www.cnblogs.com/zerotomax/p/8966856.html
Copyright © 2011-2022 走看看