LockSupport是一个编程工具类,主要是为了阻塞和唤醒线程用的,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。使用它我们可以实现很多功能,今天主要就是对这个工具类的讲解,希望对你有帮助。

文章目录

  • LockSupport简介
  • LockSupport方法
    • LockSupport中的方法
    • LockSupport方法介绍
  • LockSupport源码
  • LockSupport实例
  • 本文小结

LockSupport简介

在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步组件的实现中被频繁使用的LockSupport到底是何方神圣,现在就来看看。LockSupprot是线程的阻塞原语,用来阻塞线程和唤醒线程。每个使用LockSupport的线程都会与一个许可关联,如果该许可可用,并且可在线程中使用,则调用park()将会立即返回,否则可能阻塞。如果许可尚不可用,则可以调用 unpark 使其可用。但是注意许可不可重入,也就是说只能调用一次park()方法,否则会一直阻塞。


LockSupport方法

LockSupport中的方法


LockSupport方法介绍

LockSupport中的方法不多,且都为静态方法,这里将这些方法做一个总结:

阻塞线程

  1. void park():阻塞当前线程,如果调用unpark方法或者当前线程被中断,从能从park()方法中返回
  2. void park(Object blocker):功能同方法1,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查;
  3. void parkNanos(long nanos):阻塞当前线程,最长不超过nanos纳秒,增加了超时返回的特性;
  4. void parkNanos(Object blocker, long nanos):功能同方法3,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查;
  5. void parkUntil(long deadline):阻塞当前线程,知道deadline;
  6. void parkUntil(Object blocker, long deadline):功能同方法5,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查;

唤醒线程

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

LockSupport源码

park()源码

/*** Disables the current thread for thread scheduling purposes unless the* permit is available.** <p>If the permit is available then it is consumed and the call* returns immediately; otherwise the current thread becomes disabled* for thread scheduling purposes and lies dormant until one of three* things happens:** <ul>** <li>Some other thread invokes {@link #unpark unpark} with the* current thread as the target; or** <li>Some other thread {@linkplain Thread#interrupt interrupts}* the current thread; or** <li>The call spuriously (that is, for no reason) returns.* </ul>** <p>This method does <em>not</em> report which of these caused the* method to return. Callers should re-check the conditions which caused* the thread to park in the first place. Callers may also determine,* for example, the interrupt status of the thread upon return.*/public static void park() {UNSAFE.park(false, 0L);}

unpark()源码

 /*** Makes available the permit for the given thread, if it* was not already available.  If the thread was blocked on* {@code park} then it will unblock.  Otherwise, its next call* to {@code park} is guaranteed not to block. This operation* is not guaranteed to have any effect at all if the given* thread has not been started.** @param thread the thread to unpark, or {@code null}, in which case*        this operation has no effect*/public static void unpark(Thread thread) {if (thread != null)UNSAFE.unpark(thread);}

我们知道了实际上LockSupport阻塞和唤醒线程的功能是依赖于sun.misc.Unsafe,这是一个很底层的类,有兴趣的可以去查阅资料,比如park()方法的功能实现则是靠unsafe.park()方法


LockSupport实例

LockSupport类经典面试题:用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D5E…26Z

分析思路:LockSupport.park()让当前线程阻塞,LockSupport.unpark(t2)解锁t2线程。

package cn.wideth.util;import java.util.concurrent.locks.LockSupport;public class Main {private static Thread t1=null,t2=null;public static void main(String[] args) {char [] nums="123456789".toCharArray();char [] chars="ABCDEFGHI".toCharArray();t1=new Thread(()->{for (char c:nums) {System.out.print(c);LockSupport.unpark(t2);LockSupport.park();}},"t1");t2=new Thread(()->{for (char c:chars) {LockSupport.park();System.out.print(c);LockSupport.unpark(t1);}},"t2");t1.start();t2.start();}}

运行结果


本文小结

LockSupport是一个编程工具类,主要是为了阻塞和唤醒线程用的。首先介绍了LockSupport的基本概念,以及常用的方法,最后给出了LockSupport有关的一个经典面试题。

浅析Lock工具类LockSupport相关推荐

  1. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...

    信号量semaphore    允许多个线程同时访问 读写锁ReadWriteLock   在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch    obj = new Count ...

  2. 深入学习Lock锁(2)——LockSupport工具类

    2019独角兽企业重金招聘Python工程师标准>>> 在同步组件中,当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作.LockSupport定义 ...

  3. Java并发(六)——CAS、AQS、Lock、通信工具类

    文章目录 CAS.AQS.Lock.通信工具类 1 CAS 1.1 Unsafe类 1.2 Atomic包 2 AQS 3 Condition 4 ReentrantLock 4.1 公平锁部分源码 ...

  4. java并发编程实战(二)-并发工具类

    14 | Lock和Condition(上):隐藏在并发包中的管程 并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源:另一个是同步,即线程之间如何通信.协作 Java S ...

  5. Java 线程 - 基础及工具类 (二)

    Java 并发系列文章 Java 线程 - 并发理论基础(一) Java 线程 - 基础及工具类 (二) Java 线程 - 并发设计模式 (三) Java 线程(二) 通用的线程生命周期 Java ...

  6. 多线程总结-JUC中常用的工具类

    本文只记录JUC中较常用到的一些工具类,只是列举其常见的使用方法,至于其实现原理,此处不做说明. CountDownLatch 一个同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行 ...

  7. 死磕Java并发:J.U.C之并发工具类:Exchanger

    作者:chenssy 来源:Java技术驿站 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exc ...

  8. 线程工具类(根据电脑逻辑处理器个数控制同时运行的线程个数)

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  9. Jedis工具类(含分布式锁的调用和释放)

    个人把工具类分为两部分: 一.连接池部分 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.j ...

最新文章

  1. Android ViewTreeObserver简介-------------转
  2. python用于什么-python用于什么
  3. Dipforge 3.0 a3 发布,基于 Web 的集成开发环境
  4. Windows环境下32位汇编程序设计C版code--第四章
  5. 【中级软考】专利权的保护期限可以延长吗?商标使用权呢?
  6. 快速幂(Fast_Power)
  7. 我们在tool里给ui element设置断点,然后操作的时候,断点就触发了。Framework是咋实现的
  8. maven系列一:pom.xml文件详解
  9. vs vb连接mysql_详细介绍VS2010 VB ACCESS数据库的连接(如有不对,敬请改正)
  10. java 日期_Java中的日期操作
  11. php ci controller,Codeigniter – CI_Controller与控制器
  12. 深度学习实践指南(一)—— 卷积和池化
  13. spring定时任务详解
  14. Win10卸载微软sql服务器,卸载 SQL Server Management Studio
  15. nginx的安装升级、常用配置(一)
  16. 显卡驱动与cuda、cudnn之间的关系
  17. WINVNC源码分析(三)rdr
  18. MMDeteceion之系列一(环境安装、模型测试、训练以及模型后处理工具)
  19. 阿里云open API中的签名算法
  20. 电脑的大脑——CPU

热门文章

  1. Hibernate 简介
  2. 机器学习和统计模型的差异
  3. 黑马程序员-Java-面向对象篇上《二》
  4. 关于Android中Intent传递Serialzilable数据的问题
  5. Visual SourceSafe(VSS)使用手册(转载)
  6. matlab练习程序(图像放大/缩小,放大没有进行插值操作)
  7. Elasticsearch 5.x 字段折叠的使用
  8. hook NSArray 方法在debug模式下会崩溃, 在release模式下会返回nil
  9. LinkedIn 开源多媒体对象存储数据库 Ambry
  10. 第一个Sprint冲刺成果