Java-LockSupport
LockSupport 和 CAS 是 Java 并发包中很多并发工具控制机制的基础,它们底层其实都是依赖 Unsafe 实现。
LockSupport 提供 park() 和 unpark() 方法实现阻塞线程和解除线程阻塞。
每个使用 LockSupport 的线程都会与一个许可(permit)关联,如果该许可可用,则调用 park() 将会立即返回。如果许可尚不可用,则可以调用 unpark() 使其可用,否则可能阻塞。
permit 最多只有一个,重复调用 unpark() 也不会累加。unpark() 可以先于 park() 调用。
每个 Java 线程都有一个 Parker 实例:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/760b28d87178/src/share/vm/runtime/park.hpp,在 Parker 类里的 _counter 字段,就是用来记录所谓的“许可”的。
一、API
阻塞
- void park():阻塞当前线程,如果调用 unpark() 方法或者当前线程被中断,从能从 park() 方法中返回
- void park(Object blocker):功能同方法上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便 dump 线程时进行问题排查
- void parkNanos(long nanos):阻塞当前线程,最长不超过 nanos 纳秒,增加了超时返回的特性
- void parkNanos(Object blocker, long nanos):功能同方法上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便 dump 线程时进行问题排查
- void parkUntil(long deadline):阻塞当前线程,直到 deadline
- void parkUntil(Object blocker, long deadline):功能同方法上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便 dump 线程时进行问题排查
唤醒
- void unpark(Thread thread):唤醒处于阻塞状态的指定线程
二、使用
1.先 park 再 unpark
Thread t = new Thread(() -> {
System.out.println("睡觉");
LockSupport.park();
System.out.println("起床");
});
t.start();
Thread.sleep(1000);
System.out.println("妈妈喊我起床");
LockSupport.unpark(t);

2.先 interrupt 再 park
Thread t = new Thread(() -> {
System.out.println("睡觉");
LockSupport.park();
System.out.println("起床");
System.out.println("是否中断:" + Thread.currentThread().isInterrupted());
});
t.start();
t.interrupt();
System.out.println("突然肚子很疼");

可以看到中断后执行 park() 会直接执行下面的方法,并不会抛出 InterruptedException
3.先 unpark 再 park
Thread t = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("睡觉");
LockSupport.park();
System.out.println("7点到,起床");
});
t.start();
LockSupport.unpark(t);
System.out.println("提前上好闹钟7点起床");

先设置好许可(unpark)再获取许可的时候不会进行等待
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/LockSupport.html
Java-LockSupport的更多相关文章
- 并行编程条件变量(posix condition variables)
在整理Java LockSupport.park()东方的,我看到了"Spurious wakeup",通过重新梳理. 首先,可以在<UNIX级别编程环境>在样本: # ...
- 4.锁--并行编程之条件变量(posix condition variables)
在整理Java LockSupport.park()的东东.看到了个"Spurious wakeup".又一次梳理下. 首先来个<UNIX环境高级编程>里的样例: [c ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- Java多线程系列--“JUC锁”07之 LockSupport
概述 本章介绍JUC(java.util.concurrent)包中的LockSupport.内容包括:LockSupport介绍LockSupport函数列表LockSupport参考代码(基于JD ...
- Java并发包源码学习之AQS框架(三)LockSupport和interrupt
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
- Java多线程 LockSupport
在AQS里面进行阻塞线程,解除阻塞线程就用的LockSupport. JDK1.8源码: package java.util.concurrent.locks; import sun.misc.Uns ...
- Java的LockSupport.park()实现分析
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了主要的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,仅仅有两个函数: ...
- 4.锁定--Java的LockSupport.park()实现分析
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了主要的线程同步原语. LockSupport实际上是调用了Unsafe类里的函数.归结到Unsafe里,仅仅有两个函数: ...
- Java的LockSupport工具,Condition接口和ConditionObject
在之前我们文章(关于多线程编程基础和同步器),我们就接触到了LockSupport工具和Condition接口,之前使用LockSupport工具来唤醒阻塞的线程,使用Condition接口来实现线程 ...
随机推荐
- spring cloud EurekaClient 多网卡 ip 配置 和 源码分析(转)
https://blog.csdn.net/qq_30062125/article/details/83856655 1.前言对于spring cloud,各个服务实例需要注册到Eureka注册中心. ...
- ASE19团队项目alpha阶段model组 scrum7 记录
本次会议于11月11日,19时整在微软北京西二号楼sky garden召开,持续15分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing ...
- 【Day3】5.Python中的lxml模块
import lxml.etree as le with open('edu.html','r',encoding='utf-8') as f: html = f.read() html_x = le ...
- rdb和aof二种持久化方式对比(Redis)
我们已经知道对于一个企业级的redis架构来说,持久化是不可减少的 企业级redis集群架构:海量数据.高并发.高可用 持久化主要是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去 比如你re ...
- 如何决定使用 HashMap 还是 TreeMap?(未完成)
如何决定使用 HashMap 还是 TreeMap?(未完成)
- eclipse安装Bug检查工具
第一步:下载spotbugs工具 打开eclipse>Help>Eclipse Matketplace 打开 Eclipse Marketplace 搜索 spotbugs,点击Insta ...
- Python: sqlite3模块
sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块 SQLite 是一个C语言库,它可以提供一种轻量级的基于磁盘的数据库,这种数据库不需要独立的服务器进程,也允许需要使用一种 ...
- dcm4che-core导包失败! mvn pom文件导包总是失败
原因可能是所导的包不在共有项目中,可能在个人项目中,需要添加远程仓库 <!--远程仓库部署--><repositories> <repository> <id ...
- drf 第一节
drf django-restframework ''' 1.接口:接口的概念.数据接口文档.接口规范(restful).Postman接口测试工具 2.drf请求生命周期 - CBV 3.drf的基 ...
- PLSQL打开文件中文出现乱码
假定数据库使用的是:American_America.AL32UTF8字符集. 查询方式:SELECT * FROM v$nls_parameters ; 查看NLS_CHARACTERSET 的值是 ...