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日

相关文章

  • MyBatisPlus超详细分析条件查询

    以下是针对“MyBatisPlus超详细分析条件查询”的完整攻略: 一、MyBatisPlus概述 MyBatisPlus是对MyBatis进行了功能扩展和优化的一款工具。其提供了更加便捷的CRUD操作、Lambda表达式查询等功能,大大提升了开发效率。 二、条件查询 MyBatisPlus提供了多种条件查询的方式,包括wrapper、Lambda以及Que…

    Java 2023年5月20日
    00
  • Java命名规则详细总结

    Java命名规则详细总结 Java是一门强类型语言,命名规则是Java语言编写中一个非常重要的方面。正确的命名规则可以使代码更易于理解和维护。本文将详细总结Java命名规则,包括标识符的命名规则和Java类库的命名规则。 标识符的命名规则 在Java编程中,标识符是变量、常量、方法、类等的名称,合法的标识符应该遵循以下规则: 标识符只能由字母、数字和下划线(…

    Java 2023年5月26日
    00
  • 详解spring与jdbc整合操作

    详解spring与jdbc整合操作 1. Spring JDBC介绍 Spring JDBC是spring框架中最重要的部分之一,提供了一组用于执行SQL操作和访问关系型数据库的类和接口。 Spring JDBC提供的主要API为JdbcTemplate和NamedParameterJdbcTemplate,以及支持Transaction(事务)和DAO(数…

    Java 2023年5月20日
    00
  • java web上传文件和下载文件代码片段分享

    下面我为大家讲解一下Java Web中如何进行文件上传和下载操作。 文件上传 HTML表单 与普通的HTML表单类似,文件上传表单需要指定enctype属性为multipart/form-data。例如: <form method="post" action="upload" enctype="mult…

    Java 2023年5月20日
    00
  • 十五道tomcat面试题,为数不多的机会!

    下面我将分步骤介绍“十五道tomcat面试题,为数不多的机会!”的完整攻略。 一、了解Tomcat Tomcat是一个简单的、易于使用的Web服务器,也是一个Servlet容器。它是开源的,由Apache软件基金会维护。可以运行在Windows、Linux、Unix等多个平台上。 二、准备Tomcat面试题 为了确保你能顺利通过Tomcat的面试,你需要提前…

    Java 2023年5月19日
    00
  • HTML相关知识点总结

    HTML相关知识点总结 什么是HTML? HTML(Hypertext Markup Language)是一种用于创建Web页面的标准标记语言。它使用标记标识文本、图片、链接和其他内容,告诉Web浏览器如何组织和显示页面。 HTML基础结构 HTML文档通常包括以下结构: <!DOCTYPE html> <html> <head…

    Java 2023年5月26日
    00
  • Java Apache Commons报错“ZipFileStructureException”的原因与解决方法

    “ZipException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 压缩文件格式错误:如果压缩文件格式错误,则可能会出现此异常。例如,可能会使用错误的压缩文件格式或压缩文件包含非法字符。 压缩文件损坏:如果压缩文件损坏,则可能会出现此异常。例如,可能会在传输过程中损坏压缩文件或压缩文件存储在损坏的存储介质上。 以下…

    Java 2023年5月5日
    00
  • layui点击弹框页面 表单请求的方法

    下面我将详细讲解“layui点击弹框页面 表单请求的方法”的完整攻略。 1. 使用LayUI的弹出层实现表单弹框 使用LayUI,我们可以通过layer模块来实现弹出层效果,并且可以嵌入表单(form)来进行数据提交。 下面是一个简单的示例代码,实现了一个点击按钮后,弹出一个表单的效果。 <!DOCTYPE html> <html> …

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