类注释原文: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. springmvcdemo

      项目点击属性  2.3  转换成2.5    已经变成一个网站项目了     报错消失 pom.xml <project xmlns="http://maven.apache.or ...

  2. 【java框架】SpringBoot(7) -- SpringBoot整合MyBatis

    1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也 ...

  3. C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是编码中我们最直接打交道的三个结构.      类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字声明一 ...

  4. 比物理线程都好用的C++20的协程,你会用吗?

    摘要:事件驱动(event driven)是一种常见的代码模型,其通常会有一个主循环(mainloop)不断的从队列中接收事件,然后分发给相应的函数/模块处理.常见使用事件驱动模型的软件包括图形用户界 ...

  5. Linux上的Shebang符号(#!)

    使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 本文了将给你简单介绍一下Shebang("#!")这个符号. 首先,这个符号(#!)的名称, ...

  6. .NET平台系列8 .NET Core 各版本新功能

    系列目录     [已更新最新开发文章,点击查看详细] .NET Core 自2016年6月27日发布第一个正式版本以来,它主打的跨平台和高性能特效吸引了许多开发者,包括Java.PHP等语言的开发者 ...

  7. [Linux] Shell 脚本实例(超实用)

    文件操作 为文件(test.sh)增加执行权限 chmod +x test.sh 列出当前文件夹下所有文件(每行输出一个) 1 #!/bin/bash 2 dir=`ls ./` 3 for i in ...

  8. 【Git】git clone报错 git fatal: Unable to find remote helper for 'https'

    [参考资料] https://stackoverflow.com/questions/8329485/unable-to-find-remote-helper-for-https-during-git ...

  9. 使用find命令查找大文件

    使用find命令查找大文件 find命令是Linux系统管理员工具库中最强大的工具之一.它允许您根据不同的标准(包括文件大小)搜索文件和目录. 例如,如果在当前工作目录中要搜索大小超过100MB的文件 ...

  10. ceph总结复习

    一.ceph概念 Ceph是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展. 什么是块存储/对象存 ...