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日

相关文章

  • 在Win10上安装Tomcat服务器及配置环境变量的详细教程(图文)

    在Win10上安装Tomcat服务器及配置环境变量的详细教程: 准备工作 官方网站下载Tomcat服务器压缩文件,例如tomcat-8.5.57.tar.gz 安装JDK,推荐版本为JDK8或JDK11,JDK11及以上版本,Tomcat需版本在9及以上 确认JDK环境变量已配置 安装Tomcat 解压Tomcat服务器压缩文件到指定目录。例如,将压缩文件解…

    Java 2023年5月19日
    00
  • 如何实现线程安全的队列?

    以下是关于线程安全的队列的完整使用攻略: 什么是线程安全的队列? 线程安全的队列是指在线程环境下,多个线同时访问队列中的元素而会出现数据不一致或程序崩溃等问题。在线程编程中,线程安全的队列是非常重要的,因为多个线程同时访问队列,会出现线程争用的问题,导致数据不一致或程序崩溃。 如何实现线程安全的队列? 为实现线程安全的列,需要使用同步机制来保证多线程对队列的…

    Java 2023年5月12日
    00
  • 如何使用Java缓存框架?

    使用Java缓存框架可以有效地提高系统的性能和响应速度。下面将对如何使用Java缓存框架进行详细讲解。 什么是Java缓存框架 Java缓存框架是一个用于在内存中缓存数据的工具。它可以有效地提高系统的性能和响应速度。Java缓存框架最常用的实现方式是基于内存的缓存,使用Java缓存框架可以将数据在内存中保存一段时间,从而减少系统对数据库的访问。 常见的Jav…

    Java 2023年5月11日
    00
  • maven 解包依赖项中的文件的解决方法

    通过 Maven 进行项目构建时,通常会依赖许多第三方库和组件。这些依赖项可以通过 Maven 的依赖管理功能来添加到项目中,并在构建时自动下载和配置。但是,有时候可能需要将某些依赖项中的文件提取出来,例如:将依赖的jar包中的资源文件提取到指定的文件夹中。 下面是一种将 Maven 依赖项中的文件解压缩的方法: 步骤: 找到项目的pom.xml文件,添加m…

    Java 2023年6月2日
    00
  • 基于EJB技术的商务预订系统的开发

    开发基于EJB技术的商务预订系统可以分为以下几个步骤: 1. 需求分析和系统设计 在需求分析和系统设计阶段,需要考虑以下因素: 系统的功能需求,例如用户登录、商品展示、购物车管理、订单管理、支付管理等; 系统的性能需求,例如用户并发量、数据处理量、响应时间、可靠性等; 系统的架构设计,例如服务器端容器的选择、数据库的设计、系统的分层设计等。 示例1:用户登录…

    Java 2023年6月15日
    00
  • Java编程倒计时实现方法示例

    下面是详细讲解“Java编程倒计时实现方法示例”的完整攻略: 1. 关于Java编程倒计时的实现 Java编程中的倒计时通常通过计时器(Timer)和计时任务(TimerTask)来实现。Timer是Java提供的一个能够定时执行任务的工具类,TimerTask则是一个任务执行类,我们可以将需要定时执行的任务封装在TimerTask中,然后由Timer去执行…

    Java 2023年5月20日
    00
  • Win7系统下tomcat7.0配置教程

    下面是Win7系统下tomcat7.0的配置教程的完整攻略: 安装jdk 首先需要安装并配置好Java Development Kit(JDK),可以从Oracle的官网上下载安装包。安装完成后需要配置系统环境变量,具体参考以下步骤: 在“计算机”上右键点击“属性”; 点击“高级系统设置”; 点击“环境变量”; 在“系统变量”中新增“JAVA_HOME”变量…

    Java 2023年5月19日
    00
  • Spring Boot 启动、停止、重启、状态脚本

    Spring Boot启动、停止、重启、状态脚本的完整攻略 Spring Boot是一个非常流行的Java Web框架,它提供了许多方便的功能,如自配置、快速开发和易于部署。在本文中,我们将介绍如何编写Spring Boot的启动、停止、重启和状态脚本,并提供两个示例。 示例一:使用systemd编写脚本 systemd是一个Linux系统的初始化系统和服务…

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