`

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

 

分享到:
评论

相关推荐

    Java中LockSupport的使用.docx

    LockSupport是JDK1.6中在java.util.concurrent中的子包locks中引入的一个比较底层的工具类,用来创建锁和其他同步工具类的基本线程阻塞原语。java锁和同步器框架的核心 AQS: AbstractQueuedSynchronizer,就是通过...

    Java并发编程之LockSupport、Unsafe详解.docx

    在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步...

    Java 多线程与并发(9-26)-JUC锁- LockSupport详解.pdf

    Java 多线程与并发(9_26)-JUC锁_ LockSupport详解

    Java并发编程学习之Unsafe类与LockSupport类源码详析

    主要给大家介绍了关于Java并发编程学习之Unsafe类与LockSupport类源码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧

    详解Java多线程编程中LockSupport类的线程阻塞用法

    LockSupport类提供了park()和unpark()两个方法来实现线程的阻塞和唤醒,下面我们就来详解Java多线程编程中LockSupport类的线程阻塞用法:

    java线程阻塞中断与LockSupport使用介绍

    本文将详细介绍java线程阻塞中断和LockSupport的使用,需要了解更多的朋友可以参考下

    Java concurrency之LockSupport_动力节点Java学院整理

    主要为大家详细介绍了Java concurrency之LockSupport的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    面试必问之AQS原理详解.pdf

    AQS 原理 ...LockSupport.park() 完成,而 LockSupport.park() 则调用 sun.misc.Unsafe.park()本地方法,再进一步,HotSpot 在 Linux 中中通过调用 pthread_mutex_lock 函数把线程交给系统内核进行阻塞。

    高级开发并发面试题和答案.pdf

    Thread.sleep()和LockSupport.park()的区别 Object.wait()和LockSupport.park()的区别 线程和线程池 线程池的五种状态 线程池类型 线程池原理 线程池构造函数参数; 线程池的4种拒绝策略; 线程池中任务结束后会不会...

    Java多线程和并发知识整理

    一、理论基础 1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 ...十一、JUC锁: LockSupport详解

    JUC学习.docx Java

    一. 1.创建线程: (1)在创建线程时,传入Runnable接口的实现类,重写run方法指定执行任务 (2)使用FutureTask(实现Runnable接口)来指定任务,可以通过get方法来获得执行...(5)Park:LockSupport的静态方法,在调用时会

    【2018最新最详细】并发多线程教程

    13.LockSupport工具 14.并发容器之ConcurrentHashMap(JDK 1.8版本) 15.并发容器之ConcurrentLinkedQueue 16.并发容器之CopyOnWriteArrayList 17.并发容器之ThreadLocal 18.一篇文章,从源码深入详解ThreadLocal内存...

    LockSupportTester.zip

    测试LockSupport,LockSupport基于一个“许可”的概念实现了线程的阻塞与释放,该测试demo就是为了使这个“许可”的概念更加的清晰

    LockSupportTest.java

    LockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习...

    ThreadTest.rar

    java并发,主要用于初学者学习,主要案列,Thread.join,ThreadLocal,Lock接口,LockSupport,Condition接口,ConcurrentHashMap的实现原理与使用 Fork/Join 框架,CountDownLatch,CyclicBarrier,Semaphore,...

    Java并发包源码分析(JDK1.8)

    Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...

    disruptor-translation:Disruptor原始代码分解析出(超详细注释),版本3.4.2,方便大家阅读源码,供大家学习使用。项目中使用时请从Disruptor官方发布依赖。注释也可能存在一些不太到位的地方,可能是理解偏差,欢迎指正

    干扰翻译 Disruptor原始代码分解析出(超详细注释),版本3.4.2,方便... 增加LockSupport.parkNanos的默认睡眠时间,以防止忙碌旋转。 3.3.8 放回皮带和支架WaitStrategy发出信号。 3.3.7 将批次大小添加到BatchStar

    JUC基石——Unsafe类

    我们经常在JUC包下的ConcurrentHashMap、Atomic开头的原子操作类、AQS以及LockSupport里面看到Unsafe类的身影,这个Unsafe类究竟是干什么的,本文可以带着读者一探究竟。 Java和C++、C语言的一个重要区别,就是Java...

Global site tag (gtag.js) - Google Analytics