广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java多线程之Park和Unpark原理
  • 669
分享到

Java多线程之Park和Unpark原理

2024-04-02 19:04:59 669人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、基本使用二、特点三、park unpark 原理四、park/unpark 原理总结一、基本使用 它们是 LockSupport 类中的方法 // 暂停当前线程 Lock

一、基本使用

它们是 LockSupport 类中的方法


// 暂停当前线程
LockSupport.park(); 
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)

应用:先 park 再 unpark


Thread t1 = new Thread(() -> {
       log.debug("start...");
       sleep(1);
       log.debug("park...");
       LockSupport.park();
       log.debug("resume...");
   },"t1");
   t1.start();
   sleep(2);
   log.debug("unpark...");
   LockSupport.unpark(t1);
}
14:03:01.438 c.test21: [t1] - start...
14:03:02.444 c.test21: [t1] - park...
14:03:04.399 c.test21: [main] - unpark...
14:03:04.399 c.test21: [t1] - resume...

应用:先upark后park,park不住


package com.concurrent.test4;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

@Slf4j(topic = "c.test21:")
public class Test26 {
    public static void main(String[] args) throws InterruptedException{
        Thread t1 = new Thread(() -> {
            log.debug("start...");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("park...");
            LockSupport.park();
            log.debug("resume...");
        },"t1");
        t1.start();
        log.debug("unpark...");
        LockSupport.unpark(t1);
    }

}
14:03:35.565 c.test21: [t1] - start...
14:03:35.565 c.test21: [main] - unpark...
14:03:36.572 c.test21: [t1] - park...
14:03:36.572 c.test21: [t1] - resume...

二、特点

与 Object 的 wait & notify 相比

  • wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
  • park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll是唤醒所有等待线程,就不那么【精确】
  • park & unpark 可以先 unpark,而 wait & notify 不能先 notify

三、park unpark 原理

每个线程都有自己的一个 Parker 对象,由三部分组成 _counter , _cond 和 _mutex . 打个比喻线程就像一个旅人,Parker 就像他随身携带的背包,条件变量就好比背包中的帐篷。_counter 就好比背包中的备用干粮(0 为耗尽,1 为充足)调用 park 就是要看需不需要停下来歇息,如果备用干粮耗尽,那么钻进帐篷歇息. 如果备用干粮充足,那么不需停留,继续前进调用 unpark,就好比令干粮充足.如果这时线程还在帐篷,就唤醒让他继续前进,如果这时线程还在运行,那么下次他调用 park 时,仅是消耗掉备用干粮,不需停留继续前进,因为背包空间有限,多次调用 unpark 仅会补充一份备用干粮

在这里插入图片描述

  • 当前线程调用 Unsafe.park() 方法
  • 检查 _counter ,本情况为 0,这时,获得 _mutex 互斥
  • 线程进入 _cond 条件变量阻塞
  • 设置 _counter = 0

在这里插入图片描述

  • 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
  • 唤醒 _cond 条件变量中的 Thread_0
  • Thread_0 恢复运行
  • 设置 _counter 为 0

在这里插入图片描述

  • 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
  • 当前线程调用 Unsafe.park() 方法检查
  • _counter ,本情况为 1,这时线程无需阻塞,继续运行
  • 设置 _counter 为 0

四、park/unpark 原理总结

park 操作

1.获取当前线程关联的 Parker 对象。

2.将计数器置为 0,同时检查计数器的原值是否为 1,如果是则放弃后续操作。

3.在互斥量上加锁。

4.在条件变量上阻塞,同时释放锁并等待被其他线程唤醒,当被唤醒后,将重新获取锁。

5.当线程恢复至运行状态后,将计数器的值再次置为 0。
释放锁。

unpark 操作:

6.获取目标线程关联的 Parker 对象(注意目标线程不是当前线程)。

7.在互斥量上加锁。

8.将计数器置为 1。

9.唤醒在条件变量上等待着的线程。

10.释放锁。

到此这篇关于Java多线程之Park和Unpark原理的文章就介绍到这了,更多相关Java Park和Unpark原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java多线程之Park和Unpark原理

本文链接: https://www.lsjlt.com/news/124627.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java多线程之Park和Unpark原理
    目录一、基本使用二、特点三、park unpark 原理四、park/unpark 原理总结一、基本使用 它们是 LockSupport 类中的方法 // 暂停当前线程 Lock...
    99+
    2022-11-12
  • Java多线程之Park和Unpark原理分析
    这篇文章主要介绍了Java多线程之Park和Unpark原理分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适...
    99+
    2023-06-14
  • Java多线程之ThreadLocal原理总结
    目录1、什么是 ThreadLocal:2、ThreadLocal 的数据结构:3、ThreadLocal 的核心方法: 1、set()方法: 2、get()方法...
    99+
    2023-05-15
    Java多线程ThreadLocal 原理 Java多线程 ThreadLocal 原理
  • Java多线程之ThreadLocal的原理是什么
    今天小编给大家分享一下Java多线程之ThreadLocal的原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什...
    99+
    2023-07-06
  • Java多线程揭秘之synchronized工作原理
    目录一.特性二.加锁过程(锁升级/锁膨胀)1.无锁状态2.偏向锁3.轻量级锁4.重量级锁5.总结三.锁优化1.锁消除2.锁粗化在学习本篇文章时,如果有不太懂的地方,大家也可以先看看博...
    99+
    2022-11-12
  • Java多线程 ThreadLocal原理解析
    目录1、什么是ThreadLocal变量2、ThreadLocal实现原理3、内存泄漏问题4、使用场景1)存储用户Session2)解决线程安全的问题3)使用ThreadLocal重...
    99+
    2022-11-12
  • Java多线程使用方式和实现原理
    本篇内容介绍了“Java多线程使用方式和实现原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java中的线程Java之父对线程的定义是:线...
    99+
    2023-06-02
  • java多线程的原理是什么
    本篇内容介绍了“java多线程的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本教程操作环境:windows7系统、java10版...
    99+
    2023-06-30
  • java多线程的原理及用法
    这篇文章主要介绍“java多线程的原理及用法”,在日常操作中,相信很多人在java多线程的原理及用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java多线程的原理及用法”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • 理解Java多线程之并发编程
    目录1 多线程的使用场景2 多线程的缺点2.1 上下文切换的开销(1)上下文切换的开销(2)如何减少上下文切换2.2 多线程中的数据一致性问题(1)线程中访问外部数据的过程(2)线程...
    99+
    2023-02-02
    Java并发编程 java并发编程实战 java并发编程的艺术
  • Java多线程之深入理解ReentrantLock
    目录前言一、可重入锁二、ReentrantLock2.1 ReentrantLock的简单使用2.2 ReentrantLock UML图2.3 lock()方法调用链三、AQS3....
    99+
    2022-11-12
  • java 中多线程的原理是什么
    今天就跟大家聊聊有关java 中多线程的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.基本概念程序、进程、线程程序(program)是为完成特定任务、用某种语言编写的一...
    99+
    2023-06-20
  • java中多线程的原理是什么
    java中多线程的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据...
    99+
    2023-06-14
  • Java多线程之多种锁和阻塞队列
    目录一、悲观锁和乐观锁1.1. 乐观锁1.2. 悲观锁二、公平锁和非公平锁三、可重入锁(递归锁)四、自旋锁五、独占锁(写)/共享锁(读)六、什么是阻塞队列?七、阻塞队列(Blocki...
    99+
    2022-11-12
  • Java concurrency线程池之线程池原理(三)_动力节点Java学院整理
    线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。线程池也有5种状态;然而,线程池不同于线程,线程池的5种状态是:Running, SHUTDOWN, STOP, TIDYING, T...
    99+
    2023-05-31
    java concurrency 线程池
  • Java concurrency线程池之线程池原理(二)_动力节点Java学院整理
    线程池示例在分析线程池之前,先看一个简单的线程池示例。import java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;public clas...
    99+
    2023-05-31
    java concurrency 线程池
  • Java 程序中的多线程原理及用法
    这篇文章主要讲解了“Java 程序中的多线程原理及用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java 程序中的多线程原理及用法”吧!  为什么会排队等待?   下面的这个简单的 Ja...
    99+
    2023-06-03
  • Java多线程之死锁问题,wait和notify
    文章目录 一. synchronnized 的特性1. 互斥性2. 可重入性 二. 死锁问题1. 什么是死锁2. 死锁的四个必要条件3. 常见的死锁场景及解决3.1 不可重入造成的死锁3....
    99+
    2023-09-13
    java 死锁 wait notify synchronized
  • Java+Linux内核源码之如何理解多线程之进程
    这篇文章主要讲解了“Java+Linux内核源码之如何理解多线程之进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java+Linux内核源码之如何理解多线程之进程”吧!Linux 内核如...
    99+
    2023-06-15
  • Java中多线程同步的原理是什么
    Java中多线程同步的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、线程的先来后到我们来举一个Dirty的例子:某餐厅的卫生间很小,几乎只能容纳一个人如厕。为了保...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作