如何理解并使用 park 与 unpark

简介: park和unpark是Java中的两个线程同步工具,用于线程的阻塞和唤醒操作。

tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

一、基本介绍

park和unpark是Java中的两个线程同步工具,用于线程的阻塞和唤醒操作。

park方法是线程阻塞的方法,可以使当前线程进入等待状态,直到被其他线程唤醒。park方法有多个重载方法,其中最常用的是park()方法,该方法会使当前线程进入等待状态,直到被其他线程使用unpark方法唤醒。park方法还可以传入一个Object类型的参数,用于标识当前线程等待的条件,当该条件满足时,线程会被唤醒。

unpark方法是线程唤醒的方法,可以唤醒指定的线程。unpark方法也有多个重载方法,其中最常用的是unpark(Thread thread)方法,该方法可以唤醒指定的线程。如果该线程之前调用了park方法进入等待状态,那么它会被唤醒;如果该线程还没有调用park方法,那么它在调用park方法之后会立即返回。

park和unpark方法常用于实现线程的等待和唤醒操作,可以用于各种线程同步场景。需要注意的是,park和unpark方法应该谨慎使用,避免出现死锁等问题。

二、使用例子

package com.pany.camp.lock;

import java.util.concurrent.locks.LockSupport;

public class ParkDemo {
   

    public static void main(String[] args) {
   
        Thread thread1 = new Thread(() -> {
   
            System.out.println("Thread 1 is waiting...");
            LockSupport.park(); // 线程1等待
            System.out.println("Thread 1 is awakened.");
        });

        Thread thread2 = new Thread(() -> {
   
            System.out.println("Thread 2 is waiting...");
            LockSupport.park(); // 线程2等待
            System.out.println("Thread 2 is awakened.");
        });

        thread1.start();
        thread2.start();

        try {
   
            System.out.println("wait 2 s.");
            Thread.sleep(2000); // 等待2秒钟
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }

        LockSupport.unpark(thread1); // 唤醒线程1
        LockSupport.unpark(thread2); // 唤醒线程2
    }
}

image.png

在上面的代码中,我们创建了两个线程thread1和thread2,它们都调用了LockSupport.park()方法进入等待状态。然后我们等待了2秒钟,之后分别调用了LockSupport.unpark()方法唤醒线程1和线程2。当线程被唤醒时,它们会继续执行后面的代码。

三、使用注意事项

使用park和unpark方法需要注意以下几点:

  1. park和unpark方法应该配对使用,否则可能会出现死锁等问题,因此在使用时应该确保调用unpark方法的次数不超过调用park方法的次数。

  2. park方法可能会在没有调用unpark方法的情况下一直阻塞线程,因此在使用时应该确保线程有被唤醒的机会。

  3. park和unpark方法可以用于线程的等待和唤醒操作,但是在某些情况下可能不是最优的选择,因此在使用时应该根据具体情况选择合适的线程同步机制。

  4. park和unpark方法是比较底层的线程同步工具,使用时需要注意线程安全和可读性等问题,避免出现潜在的问题。

总之,使用park和unpark方法需要谨慎,遵循最佳实践,才能保证线程同步的正确性和高效性。

目录
相关文章
|
2月前
|
分布式计算 Shell Scala
学习使用Spark
学习使用Spark
102 3
|
3月前
|
分布式计算 Shell Scala
如何开始学习使用Spark?
【8月更文挑战第31天】如何开始学习使用Spark?
95 2
|
6月前
|
存储 分布式计算 资源调度
|
6月前
|
存储 分布式计算 程序员
Spark基础 之 Spark的介绍
Spark基础 之 Spark的介绍
104 0
|
6月前
|
SQL 机器学习/深度学习 分布式计算
Spark的主要概念
Spark的主要概念
|
SQL 存储 分布式计算
剖析下 HiveOnSpark与 SparkOnHive 的异同
剖析下 HiveOnSpark与 SparkOnHive 的异同
|
分布式计算 Hadoop Java
【Spark】(三)Spark 架构原理和RDD使用详解2
【Spark】(三)Spark 架构原理和RDD使用详解2
152 0
【Spark】(三)Spark 架构原理和RDD使用详解2
|
分布式计算 Spark
Spark的几个概念
Spark的几个概念
173 0
|
存储 分布式计算 大数据
Spark中几种ShuffleWriter的区别你都知道吗?
一.前言 在Spark中有三种shuffle写,分别是BypassMergeSortShuffleWriter、UnsafeShuffleWriter、SortShuffleWriter。分别对应三种不同的shuffleHandle。
1343 0