类注释原文:Basic thread blocking primitives for creating locks and other synchronization classes.
意思就是LockSupport类用于创建锁和其他同步类的基本线程阻塞原语。

LockSupport是基于Unsafe实现的提供的两个主要方法就是park()和unpark()。
其中park()方法我们可以理解为阻塞,等待,挂起,而unpark()我们理解为唤醒,恢复。

park()方法和unpark()方法解释。

LockSupport是其他同步类的及基本线程阻塞原语,所以并不需要获取对象的监视器,而是给线程一个“许可”(permit)。而每个线程的permit只能是0个或者1个。

unpark会给线程一个permit,而且最多是1;而park会消耗一个permit并返回,如果线程没有permit则会阻塞。(默认情况下permit的数量为0,也就是如果直接调用park方法的话,会被直接阻塞的。)

下面我们将对照着源码注释和代码示例对比一下我们的理解是否正确。

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>
*
*/


上面是park()方法的注释,什么意思呢?
意思就是除非线程允许,否则禁用当前线程以进行线程调度。如果有许可(permit)的话,则将其消耗掉,并且立即返回;否则,出于线程调度的目的,当前线程将被禁用并处于休眠状态,

直到发生以下三种情况之一:

(1):其他线程将当前线程作为目标调用unpark方法;

(2):其他线程interrupt interrupts中断当前线程;

(3):调用无条件返回

unpark(Thread thread)

* 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.

 如果thread线程不可用,则使该线程可用并给他一个许可(permit),。

如果thread线程在被阻止,则它将取消阻止。否则,将确保其对下一次调用park()不会阻塞。

如果给定线程尚未启动,则此操作根本无法保证会产生任何效果。

下面我们就用代码测试一下上面的结论:

(1)直接调用park()会被阻塞

public class TestLockSupport {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
System.out.println("进入" + Thread.currentThread().getName());
LockSupport.park();
System.out.println(Thread.currentThread().getName()+":"+"block");
LockSupport.park();
System.out.println(Thread.currentThread().getName()+":"+"unblock");
},"线程1");
t1.start();
}
}

只执行了 System.out.println("进入" + Thread.currentThread().getName());说明后面的被阻塞了。

(2)直接调用unpark()会解除阻塞

public class TestLockSupport {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
System.out.println("进入" + Thread.currentThread().getName());
LockSupport.park();
System.out.println(Thread.currentThread().getName()+":"+"block");
LockSupport.park();
System.out.println(Thread.currentThread().getName()+":"+"unblock");
},"线程1"); t1.start();
LockSupport.unpark(t1);
Thread.sleep(1000);
LockSupport.unpark(t1);
}
}

三次输出都执行了,说明unpark()起作用了。

(3)每个线程最多有一个permit

public class TestLockSupport {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("进入" + Thread.currentThread().getName());
LockSupport.park();
System.out.println(Thread.currentThread().getName()+":"+"block");
LockSupport.park();
System.out.println(Thread.currentThread().getName()+":"+"unblock");
},"线程1"); t1.start();
LockSupport.unpark(t1);
LockSupport.unpark(t1);
LockSupport.unpark(t1);
LockSupport.unpark(t1);
LockSupport.unpark(t1);
}
}

在线程t1执行LockSupport.park();之前多次执行了 LockSupport.unpark(t1);,但是最后 System.out.println(Thread.currentThread().getName()+":"+"unblock");没有执行,说明permit的数量只有一个。

LockSupport中的park()与unpark()的更多相关文章

  1. LockSupport的park和unpark

    LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语. Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Lo ...

  2. 温故知新-多线程-深入刨析park、unpark

    文章目录 摘要 park.unpark 看一下hotspot实现 参考 你的鼓励也是我创作的动力 Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | ...

  3. park和unpark

    1 介绍 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport提供的两个主要方法就是park和unpark. park译为&quo ...

  4. LockSupport的park和unpark的基本使用,以及对线程中断的响应性

    LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语.java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Loc ...

  5. LockSupport HotSpot里park/unpark的实现

    每个java线程都有一个Parker实例,Parker类是这样定义的: class Parker : public os::PlatformParker { private: volatile int ...

  6. 转:php park、unpark、ord 函数使用方法(二进制流接口应用实例)

    在工作中,我也逐渐了解到park,unpark,ord对于二进制字节处理的强大. 下面我逐一介绍它们.     park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一 ...

  7. park、unpark、ord 函数使用方法(转)

    park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php接收.当时在处理时候,查阅不少资料.因为它们使用确实比较少, ...

  8. Linux 进程中 Stop, Park, Freeze【转】

    转自:https://blog.csdn.net/yiyeguzhou100/article/details/53134743 http://kernel.meizu.com/linux-proces ...

  9. 详解Java多线程编程中LockSupport

    LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark() ...

随机推荐

  1. 那些好用的 VS Code 插件,究竟是如何提高编码效率的?

    在上一篇文章中我们已经对 vscode 插件有了一个初步的认识与了解了,接下去我们就要"揭秘"一下市面上那些好用的 vscode 插件究竟是如何帮我们提高工作效率的. 本文首发于「 ...

  2. Django(19)QuerySet API

    前言 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager ...

  3. qsort和sort学习与比较

    阅读另一篇博文Uva 642 - Word Amalgamation sort qsort 1.qsort函数: 原 型: void qsort(void *base, int nelem, int ...

  4. 【秒懂音视频开发】23_H.264编码

    本文主要介绍一种非常流行的视频编码:H.264. 计算一下:10秒钟1080p(1920x1080).30fps的YUV420P原始视频,需要占用多大的存储空间? (10 * 30) * (1920 ...

  5. GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充

    中文编码:GB2312编码.GBK编码.GB18030编码 2016-09-01 0 By ADMIN 一.GB 2312编码 中华人民共和国国家标准简体中文字符集,全称<信息交换用汉字编码字符 ...

  6. canal 环境搭建 canal 与kafka通信(三)

    canal 占用了生产者 .net core端 使用消费者获取canal 消息 安装 Confluent.Kafka  demo使用 1.3.0 public static void Consumer ...

  7. KEIL expected an identifier

    error: #40: expected an identifier(在线等) C语言编译是提示的.这句话是什么意思啊, 怎样解决啊  我来答  浏览 33290 次   4个回答 #活动# [芝麻 ...

  8. shell初学之PHP

    初次接触脚本,写了一个通过Apache实现PHP动态网站的脚本: #!/bin/bash yum -y install php rm -rf /etc/httpd/conf.d/welcome.con ...

  9. mysql基础之mariadb概念

    一.数据库介绍 什么是数据库(Database)? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库 ...

  10. Linux服务之cobbler批量部署篇

    一.Cobbler简介:Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置.相当于Cobbler封装了DHCP.TFTP.XINTED等服务,结合了PXE.kick ...