在java中,要让线程等待最普通的方法是调用Object.wait()方法,
Causes the current thread to wait until another thread invokes the notify() method for this object.
但是当我阅读JUC(java.util.concurrent)的源码时发现这个包不是这样做的, 我跟踪CountDownLatch.await()调用,最后跟到了LockSupport.park()方法里, 这里调用的是 unsafe.park()方法来block线程。
LockSupport 和 CAS一样是JUC很多控制机制的基础(但他们的底层其实都是在依赖Unsafe),下面就来学习下LockSupport这个类:
// Hotspot implementation via intrinsics API private static final Unsafe unsafe = Unsafe.getUnsafe(); //unsafe 用来实现底层操作 private static final long parkBlockerOffset; //辅助参数,配合unsafe用的 //This object is recorded while // the thread is blocked to permit monitoring and diagnostic tools to // identify the reasons that threads are blocked. //设置一个线程和关联的blocker对象,blocker用来做分析,debug用的 private static void setBlocker(Thread t, Object arg) { // Even though volatile, hotspot doesn't need a write barrier here. unsafe.putObject(t, parkBlockerOffset, arg); } //block当前线程,是否真的block了取决于permit是否available //permit相当于1,0的开关, 默认是0, 调一次unpark就+1变成1了,调一次park会消费这个1又变成0了(park立即返回), //再次调用park会变成block(因为没有1可以拿了,会等在这,直到有1),这时调用unpark会把1给回去(线程解锁返回) //每个线程都有个相关的permit, permit最多一个,调用unpark多次也不会积累 //当为permit available时,方法会立即返回,不会block,反之就会block当前线程直到下面3件事发生 //1. 其他线程调用了unpark(此线程) //2. 其他线程interrupts了此线程 //3. The call spuriously (that is, for no reason) returns. public static void park() { unsafe.park(false, 0L); } //对于给定线程,让permit变得avaliable, public static void unpark(Thread thread) { if (thread != null) unsafe.unpark(thread); } //然后park有2个带限定时间的版本,所以一共有3个park version, 这3个version又有带blocker的debug版本 public static void parkNanos(long nanos) { public static void parkUntil(long deadline) {
下面写些代码试下
System.out.println("start"); LockSupport.parkNanos(1000000000); System.out.println("end"); //一开始会block线程,直到给定时间过去后才往下走 System.out.println("start"); LockSupport.unpark(Thread.currentThread()); LockSupport.parkNanos(1000000000); System.out.println("end"); //不会block,因为一开始给了一个permit System.out.println("start"); LockSupport.unpark(Thread.currentThread()); LockSupport.unpark(Thread.currentThread()); LockSupport.parkNanos(1000000000); System.out.println("inter"); LockSupport.parkNanos(1000000000); System.out.println("end"); //第一个park不会block,第2个会,因为permit不会因为多次调用unpark就积累
相关推荐
LockSupport是JDK1.6中在java.util.concurrent中的子包locks中引入的一个比较底层的工具类,用来创建锁...根据LockSupport 源码发现LockSupport的核心方法都是基于大名鼎鼎的sun.misc.Unsafe类中的park和unpark实现的。
LockSupport.xmid总结,用于知识巩固,
主要给大家介绍了关于Java并发编程学习之Unsafe类与LockSupport类源码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步...
LockSupport类提供了park()和unpark()两个方法来实现线程的阻塞和唤醒,下面我们就来详解Java多线程编程中LockSupport类的线程阻塞用法:
Java 多线程与并发(9_26)-JUC锁_ LockSupport详解
本文将详细介绍java线程阻塞中断和LockSupport的使用,需要了解更多的朋友可以参考下
主要为大家详细介绍了Java concurrency之LockSupport的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
Disruptor原始代码分解析出(超详细注释),版本3.4.2,方便大家阅读源码,供大家学习使用。项目中使用时请从Disruptor官方发布依赖。 ,欢迎指正。 LMAX破坏者 高性能线程间消息传递库 维护者 文献资料 变更日志 ...
测试LockSupport,LockSupport基于一个“许可”的概念实现了线程的阻塞与释放,该测试demo就是为了使这个“许可”的概念更加的清晰
AQS 原理 ...LockSupport.park() 完成,而 LockSupport.park() 则调用 sun.misc.Unsafe.park()本地方法,再进一步,HotSpot 在 Linux 中中通过调用 pthread_mutex_lock 函数把线程交给系统内核进行阻塞。
LockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习...
18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题 19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之...
Thread.sleep()和LockSupport.park()的区别 Object.wait()和LockSupport.park()的区别 线程和线程池 线程池的五种状态 线程池类型 线程池原理 线程池构造函数参数; 线程池的4种拒绝策略; 线程池中任务结束后会不会...
hashmap源码 to-be-architect to be a Java architect,you should learn these.This page is updated irregularly. Java基础 深入分析 Java SPI 机制和原理 并发编程专题 Executors线程池 线程池ThreadPoolExecutor...
一、理论基础 1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 ...十一、JUC锁: LockSupport详解
java并发,主要用于初学者学习,主要案列,Thread.join,ThreadLocal,Lock接口,LockSupport,Condition接口,ConcurrentHashMap的实现原理与使用 Fork/Join 框架,CountDownLatch,CyclicBarrier,Semaphore,...
一. 1.创建线程: (1)在创建线程时,传入Runnable接口的实现类,重写run方法指定执行任务 (2)使用FutureTask(实现Runnable接口)来指定任务,可以通过get方法来获得执行...(5)Park:LockSupport的静态方法,在调用时会