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日

相关文章

  • 详解Spring Security中的HttpBasic登录验证模式

    开发Web应用时,安全措施不可忽视,特别是对于需要用户登录的应用程序。Spring Security是一个功能强大的安全框架,它支持多种身份验证和授权方案。其中,HttpBasic登录验证模式是最简单的一种方式。本文将详细讲解Spring Security中的HttpBasic登录验证模式。 什么是HttpBasic登录验证模式 HttpBasic登录验证模…

    Java 2023年5月20日
    00
  • Java中Socket用法详解

    Java中Socket用法详解 概述 Java中提供了Socket和ServerSocket这两个类用于网络通信,其中Socket是客户端用于构建TCP协议连接的类,而ServerSocket则是服务端用于监听和接受连接请求的类。 Socket 1. 创建Socket 可以通过如下方式创建Socket连接: Socket socket = new Socke…

    Java 2023年5月26日
    00
  • Spring Boot应用开发初探与实例讲解

    Spring Boot应用开发初探与实例讲解 什么是Spring Boot? Spring Boot是由Spring官方推出的一款快速构建spring应用程序的框架。它简化了Spring应用程序的开发和部署过程,提供了许多默认配置和开箱即用的组件,使得开发者能够更加专注于业务逻辑的编写。 如何开始Spring Boot应用开发? 步骤一:环境准备 首先,我们…

    Java 2023年5月19日
    00
  • 老生常谈计算机中的编码问题(必看篇)

    老生常谈计算机中的编码问题(必看篇) 简介 计算机中的编码问题是计算机领域长期存在的老生常谈问题之一。这个问题的本质是计算机内部和外部传输的信息都需要以某种编码方式呈现,而不同的编码方式之间可能存在互相转换的问题,容易引起信息传输和解读上的困难。 常见编码方式 常见的计算机编码方式包括ASCII编码、Unicode编码和UTF-8编码等。其中: ASCII编…

    Java 2023年5月20日
    00
  • layui table 表格模板按钮的实例代码

    本次我们简单介绍一下“layui table 表格模板按钮的实例代码”的完整攻略。 1. 基础设置 首先,我们需要引入layui框架中的table.js和laytpl.js文件。安装起来方法也非常简单,只需要执行以下代码即可。 <script src="lay/modules/table.js"></script>…

    Java 2023年6月15日
    00
  • java maven进阶教学

    Java Maven进阶教学攻略 Maven 是 Java 中最流行的构建工具之一,它可以自动化地管理和构建项目的依赖关系,允许开发人员专注于业务代码的开发。 安装 Maven Maven 的安装十分简单,只要在官网下载对应操作系统的二进制包,解压即可。详细步骤参考 Maven 安装指南: # 下载 Maven $ wget https://www-us.a…

    Java 2023年5月20日
    00
  • 利用Dockerfile制作java运行环境的镜像的方法步骤

    准备Java应用程序 在制作Java运行环境的Docker镜像前,需要先准备好Java应用程序,比如一个Java Web应用程序,这里以名为“example”的Spring Boot应用程序为例。 编写Dockerfile Dockerfile是Docker镜像的构建脚本,需要在其中指定Docker镜像的环境以及各种组件。以下是一个基础的Dockerfile…

    Java 2023年5月19日
    00
  • Java分布式session存储解决方案图解

    Java分布式session存储是指将Web应用中的session数据存储在多个服务器上,从而实现应用服务器之间的session数据共享,以提高系统的可靠性和可伸缩性。常用的Java分布式session存储解决方案有以下几种: 基于Tomcat的分布式session存储解决方案 1. 安装Tomcat服务器 在多个服务器上安装Tomcat应用服务器,确保To…

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