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://benjaminwhx.com/2018/05/01/%E3%80%90%E7%BB%86%E8%B0%88Java%E5%B9%B6%E5%8F%91%E3%80%91%E8%B0%88%E8%B0%88LockSupport/

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/LockSupport.html

Java-LockSupport的更多相关文章

  1. 并行编程条件变量(posix condition variables)

    在整理Java LockSupport.park()东方的,我看到了"Spurious wakeup",通过重新梳理. 首先,可以在<UNIX级别编程环境>在样本: # ...

  2. 4.锁--并行编程之条件变量(posix condition variables)

    在整理Java LockSupport.park()的东东.看到了个"Spurious wakeup".又一次梳理下. 首先来个<UNIX环境高级编程>里的样例: [c ...

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  5. Java多线程系列--“JUC锁”07之 LockSupport

    概述 本章介绍JUC(java.util.concurrent)包中的LockSupport.内容包括:LockSupport介绍LockSupport函数列表LockSupport参考代码(基于JD ...

  6. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  7. Java多线程 LockSupport

    在AQS里面进行阻塞线程,解除阻塞线程就用的LockSupport. JDK1.8源码: package java.util.concurrent.locks; import sun.misc.Uns ...

  8. Java的LockSupport.park()实现分析

    LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了主要的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,仅仅有两个函数: ...

  9. 4.锁定--Java的LockSupport.park()实现分析

    LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了主要的线程同步原语. LockSupport实际上是调用了Unsafe类里的函数.归结到Unsafe里,仅仅有两个函数: ...

  10. Java的LockSupport工具,Condition接口和ConditionObject

    在之前我们文章(关于多线程编程基础和同步器),我们就接触到了LockSupport工具和Condition接口,之前使用LockSupport工具来唤醒阻塞的线程,使用Condition接口来实现线程 ...

随机推荐

  1. 图片样式加hover特效

    之前有个尴尬的事情发生,我不知道如何将文字放在图片右边,我想了个麻烦且愚蠢的办法,后来才知道只需要将图片居左就可以达到效果.....不说了看下面 需要实现的效果: 很简单, <img src=& ...

  2. 个人学习HTML以及CSS所得体会

    拥有自己样式的浏览器: 苹果,欧朋,谷歌,IE,火狐 form标签<form></form> 表单属性: 1,action主要同来规定表单的作用,提交到处理器上面处理URL,默 ...

  3. 使用nodejs创建Marketing Cloud的contact数据

    源代码如下: var config = require("./mcConfig"); var request = require('request'); var url = con ...

  4. MySQL间隙锁问题

    间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间. 最近用户反馈说系统老是出现insert时,等待超时了,最后发现是ins ...

  5. yii框架下使用redis

    1 首先获取到 yii2-redis-master.zip 压缩包 下载地址https://github.com/yiisoft/yii2-redis/archive/master.zip 2 把下载 ...

  6. PhpStorm添加PHP代码规范检查CodeSniffer(phpcs)和PHP代码静态分析工具Mess Detector(phpmd)

    一.安装 添加镜像,加速下载 ./composer.phar  config -g repo.packagist composer https://packagist.phpcomposer.com ...

  7. 2.06_Python网络爬虫_正则表达式

    一:爬虫的四个主要步骤 明确目标 (要知道你准备在哪个范围或者网站去搜索) 爬 (将所有的网站的内容全部爬下来) 取 (过滤和匹配我们需要的数据,去掉没用的数据) 处理数据(按照我们想要的方式存储和使 ...

  8. 开放式最短路径优先OSPF

    1.OSPF基本知识 OSPF作为基于链路状态的协议,解决了RIP在收敛慢,路由环路,可扩展性差等问题,还有以下优点: 采用组播方式发布报文,可以减少对其他不运行ospf路由器的影响 ospf直尺无类 ...

  9. P4074 [WC2013]糖果公园

    思路 带修莫队+树上莫队 注意代码细节即可,答案的维护非常简单 蒟蒻的大常数代码 #include <cstdio> #include <algorithm> #include ...

  10. 使用原生js 实现点击消失效果

    JQ版 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...