Java concurrency之LockSupport_动力节点Java学院整理

Java concurrency之LockSupport

什么是LockSupport

LockSupport是Java并发包中的一个类,用于创建锁和其他同步类的基本构建块,它与已有的同步类不同,其可以阻塞和唤醒线程。LockSupport提供了非常灵活的线程阻塞和唤醒操作,其不会遇到像Object.wait和Thread.join方法那样的一些限制,如同程度、顺序性等,从而使LockSupport更具灵活性。LockSupport提供了park和unpark两个方法分别用于阻塞和唤醒线程。

park方法

park方法用于阻塞当前线程,方法有多种实现方式,但无论如何,调用park方法都会让线程进入一种阻塞状态。LockSupport提供了三个版本的park方法,分别是:

public static void park();
public static void park(Object blocker);
public static void parkNanos(long nanos);
public static void parkNanos(Object blocker, long nanos);
public static void parkUntil(long deadline);
public static void parkUntil(Object blocker, long deadline); 
  • 第一个版本的park方法将让当前线程一直阻塞,直到有其他线程通过unpark方法唤醒该线程。
  • 第二个版本的park方法会将Object对象作为阻塞的参数,调用该方法会使当前线程阻塞,并将Object对象与当前线程关联起来,其它线程无法访问该Object对象。
  • 第三个版本的park方法将会阻塞当前线程一定的时间。
  • 第四个版本的park方法则接收两个参数,第一个参数阻塞的同步对象,第二个参数阻塞的时间。
public class LockSupportTest{

    public static void main(String[] args) throws Exception{
        Thread thread = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " park ...");
            LockSupport.park();
            System.out.println(Thread.currentThread().getName() + " unpark ...");
        },"Thread-A");
        thread.start();
        TimeUnit.SECONDS.sleep(2L);
        LockSupport.unpark(thread);
    }
}
  • 程序输出:
Thread-A park ...
Thread-A unpark ...

unpark方法

unpark方法用于唤醒指定线程,调用unpark方法可以使得其它线程中因调用park方法而被阻塞的线程恢复运行。可以调用多次unpark方法唤醒同一个被阻塞的线程,也可以在调用park方法之前调用unpark方法,这种情况下,线程调用park方法时,不会阻塞,即park方法不起作用。

public class LockSupportTest {
    public static void main(String[] args) throws Exception{
        Thread thread = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + ": park1");
            LockSupport.park();
            System.out.println(Thread.currentThread().getName() + ": park2");
            LockSupport.park();
            System.out.println(Thread.currentThread().getName() + ": unpark1");
            LockSupport.unpark(Thread.currentThread());
            System.out.println(Thread.currentThread().getName() + ": park3");
            LockSupport.park();
            System.out.println(Thread.currentThread().getName() + ": unpark2");
        }, "Thread-A");
        thread.start();
        TimeUnit.SECONDS.sleep(2L);
        System.out.println(Thread.currentThread().getName() + ": unpark1");
        LockSupport.unpark(thread);
        TimeUnit.SECONDS.sleep(2L);
        System.out.println(Thread.currentThread().getName() + ": unpark2");
        LockSupport.unpark(thread);
    }
}
  • 程序输出:
Thread-A: park1
main: unpark1
Thread-A: park2
Thread-A: unpark1
Thread-A: park3
main: unpark2

总结

  • LockSupport提供的park和unpark方法可以实现线程的阻塞和唤醒操作;
  • LockSupport相比于Object.wait和Thread.join,更加灵活、可靠;
  • unpark方法可以先于park方法调用,不影响后续线程的阻塞;
  • 可以通过指定同步对象,让阻塞的线程与同步对象关联,从而实现更加复杂的同步逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java concurrency之LockSupport_动力节点Java学院整理 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • springboot 整合邮件发送功能

    整合邮件发送功能是 Spring Boot 中常见的应用场景之一。下面是整合邮件发送功能的完整攻略: 步骤一:添加邮件依赖 在 pom.xml 文件中添加以下依赖,在这个依赖中包含了spring-boot-starter-mail的所有依赖。 <dependency> <groupId>org.springframework.boot…

    Java 2023年6月15日
    00
  • java连接mysql数据库的方法

    针对”java连接mysql数据库的方法”,我可以提供以下完整攻略: 1. 导入mysql的驱动包 在使用Java进行连接MySQL数据库之前,我们首先需要导入mysql的驱动包。可以从MySQL官方网站下载最新的版本并解压,或者去Maven仓库搜索下载最新版本。 假设我们将下载的驱动包保存在项目根目录下的lib文件夹中,那么就需要在项目的pom.xml中添…

    Java 2023年5月19日
    00
  • SpringBoot 如何自定义请求参数校验

    根据您的需求,我会详细讲解 SpringBoot 如何自定义请求参数校验的完整攻略。 1. 简介 SpringBoot默认使用 Hibernate Validator 作为参数校验的实现库(底层实现其实是 JSR-303 Bean Validation 规范)。在进行参数校验时,我们通常会使用一组预定义好的注解,如:@NotNull、@Min、@Max、@S…

    Java 2023年5月20日
    00
  • js创建jsonArray传输至后台及后台全面解析

    请看下面的攻略: 客户端(js)创建jsonArray并传输至服务端 创建jsonArray 1.定义一个空的jsonArray: var jsonArray = []; 2.向jsonArray中添加数据: var jsonArray = []; for (var i = 0; i < 3; i++) { var jsonObj = { name: …

    Java 2023年5月26日
    00
  • Java实现解析JSON大文件JsonReader工具详解

    Java实现解析JSON大文件JsonReader工具详解 1. 什么是JsonReader? JsonReader 是 Google 提供的一个用于解析 JSON 的 Java 工具,它可以有效地解析大型 JSON 文件,并将 JSON 数据转化为 Java 对象。相比于其他 JSON 解析工具,JsonReader 不会将整个 JSON 文件载入内存,而…

    Java 2023年5月26日
    00
  • jsp实现从服务器下载xls文件到客户端的方法

    实现从服务器下载xls文件到客户端通常可以通过以下步骤来完成: 服务器端准备Excel文件 首先需要在服务器端生成或获取Excel文件。一种常见的方式是使用Java POI库来动态生成Excel文件。例如,以下代码可以生成一个包含数据的Excel文件: // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创…

    Java 2023年6月15日
    00
  • 教你如何写springboot接口 

    教你如何写Spring Boot接口的完整攻略 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、便捷的方式来创建基于Spring的应用程序,同时也提供了一些默认的和约定,使得开发人员可以更加专注于业务逻辑的实现。本文将详细讲解如何使用Spring Boot编写接口,并提供两个示例。 1. 创建Spring Boot…

    Java 2023年5月15日
    00
  • Eclipse开发Java常用快捷键怎么设置?

    要设置Eclipse开发Java常用快捷键,我们可以按照以下步骤执行: 打开Eclipse,点击”Window”菜单项,选择”Preferences”。 在弹出的对话框中,选择”General” -> “Keys”。 在”Keys”页面中,可以看到Eclipse支持的所有命令和快捷键的列表。 找到您要设置的快捷键对应的命令。如果您不确定命令名称,可以在…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部