locksupport的park和unpark

news2024/11/19 11:24:57

 

locksupport是什么

LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。

有什么用

接下面我来看看LockSupport有哪些常用的方法。主要有两类方法:parkunpark

public static void park(Object blocker); // 暂停当前线程
public static void parkNanos(Object blocker, long nanos); // 暂停当前线程,不过有超时时间的限制
public static void parkUntil(Object blocker, long deadline); // 暂停当前线程,直到某个时间
public static void park(); // 无期限暂停当前线程
public static void parkNanos(long nanos); // 暂停当前线程,不过有超时时间的限制
public static void parkUntil(long deadline); // 暂停当前线程,直到某个时间
public static void unpark(Thread thread); // 恢复当前线程
public static Object getBlocker(Thread t);

为什么叫park呢,park英文意思为停车。我们如果把Thread看成一辆车的话,park就是让车停下,unpark就是让车启动然后跑起来。

我们写一个例子来看看这个工具类怎么用的

public class LockSupportDemo {

    public static Object u = new Object();
    static ChangeObjectThread t1 = new ChangeObjectThread("t1");
    static ChangeObjectThread t2 = new ChangeObjectThread("t2");

    public static class ChangeObjectThread extends Thread {
        public ChangeObjectThread(String name) {
            super(name);
        }
        @Override public void run() {
            synchronized (u) {
                System.out.println("in " + getName());
                LockSupport.park();
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("被中断了");
                }
                System.out.println("继续执行");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        t1.start();
        Thread.sleep(1000L);
        t2.start();
        Thread.sleep(3000L);
        t1.interrupt();
        LockSupport.unpark(t2);
        t1.join();
        t2.join();
    }
}

运行的结果如下:

in t1
被中断了
继续执行
in t2
继续执行

  1. park不需要获取某个对象的锁
  2. 因为中断的时候park不会抛出InterruptedException异常,所以需要在park之后自行判断中断状态,然后做额外的处理

我们再来看看Object blocker,这是个什么东西呢?这其实就是方便在线程dump的时候看到具体的阻塞对象的信息。

"t1" #10 prio=5 os_prio=31 tid=0x00007f95030cc800 nid=0x4e03 waiting on condition [0x00007000011c9000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
    // `下面的这个信息`
    at com.wtuoblist.beyond.concurrent.demo.chapter3.LockSupportDemo$ChangeObjectThread.run(LockSupportDemo.java:23) // 
    - locked <0x0000000795830950> (a java.lang.Object)

还有一个地方需要注意,相对于线程的stop和resumepark和unpark的先后顺序并不是那么严格。stop和resume如果顺序反了,会出现死锁现象。而park和unpark却不会。这又是为什么呢?还是看一个例子

public class LockSupportDemo {

    public static Object u = new Object();
    static ChangeObjectThread t1 = new ChangeObjectThread("t1");

    public static class ChangeObjectThread extends Thread {

        public ChangeObjectThread(String name) {
            super(name);
        }

        @Override public void run() {
            synchronized (u) {
                System.out.println("in " + getName());
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                LockSupport.park();
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("被中断了");
                }
                System.out.println("继续执行");
            }
        }
    }

    public static void main(String[] args) {
        t1.start();
        LockSupport.unpark(t1);
        System.out.println("unpark invoked");
    }
}

t1内部有休眠1s的操作,所以unpark肯定先于park的调用,但是t1最终仍然可以完结。这是因为park和unpark会对每个线程维持一个许可(boolean值)

  1. unpark调用时,如果当前线程还未进入park,则许可为true
  2. park调用时,判断许可是否为true,如果是true,则继续往下执行;如果是false,则等待,直到许可为true



作者:juconcurrent
链接:https://www.jianshu.com/p/f1f2cd289205
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1,park

2,unpark 

 当调用park时候,如果许可可用,就使用该许可,并且立即返回;否则就为线程调度禁用当前线程

当调用unpark时候相反,调用unpark时候,给定的线程许可不可用,会增加一个可用的许可。如果线程是park上受阻,则它将其解除阻塞状态。否则保证下一次调用park时候不会受阻,如果给定线程尚未启动,则无法保证此操作有任何效果。

总结一下

  1. park和unpark可以实现类似wait和notify的功能,但是并不和wait和notify交叉,也就是说unpark不会对wait起作用,notify也不会对park起作用。
  2. park和unpark的使用不会出现死锁的情况
  3. blocker的作用是在dump线程的时候看到阻塞对象的信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java:jackson 二:Custom Deserialization in Jackson

java&#xff1a;jackson 二&#xff1a;Custom Deserialization in Jackson 1 前言 jackson支持自定义反序列化器&#xff0c;参考文档地址如下&#xff1a; https://www.baeldung.com/jacksonhttps://www.baeldung.com/jackson-deserialization依赖如下&#xff08;这里使…

基于FPGA的幅频均衡带通滤波器的设计

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 数字通信系统中&#xff0c;由于多径传输、信道衰落等影响&#xff0c;在接收端会产生严重的码间干扰&#xff0c;增大误码率。为了克服码间干扰&#xff0c;提高通信系统的性能&#xff0c;在接…

记录Android Jni编译过程

Gradle配置 我们主要看这个配置文件里面吧&#xff0c;这里面有关于ndk配置的选项。 大概介绍一下&#xff0c;这里面一些字段是干嘛的。 我们看&#xff0c;这里面有两个相仿的字段&#xff0c;都是externalNativeBuild字段&#xff0c;但是位于两个不同的位置&#xff0c;其…

小程序02/小程序 响应式单位rpx 、image组件概念说明 和 mode属性介绍

一. 响应式单位rpx rpx 说明 rpx: 规定不管屏幕为多少px , 100%的屏幕宽度就是750rpx 100% 屏幕的宽度 750rpx rpx响应单位 rpx是微信小程序独有的&#xff0c;解决屏幕自适应的尺寸单位 可以根据屏幕宽度进行自适应&#xff0c;不论大小屏幕&#xff0c;规定屏幕宽为750…

数据首发!空气悬挂前装搭载率破1%,明年冲刺70万套

新能源智能化的合力变革&#xff0c;带动汽车行业进入新的发展周期&#xff1a;如何进一步提升整车轻量化、驾驶和乘坐的安全和体验。这其中&#xff0c;乘用车悬挂系统也在发生新的变化。 此前&#xff0c;除了传统固定式金属螺旋弹簧悬挂&#xff0c;主动悬架系统的前装上车主…

学计算机网络太难?原来方法没用对...

计算机世界里的三座大山: 计算机网络&#xff0c;操作系统&#xff0c;算法与数据结构。跨过去的人都是神一样的存在了。 学计算机网络也要讲究学习方法 从实际案例出发&#xff08;比如我们在浏览器输入一个网址到展示出内容中间发生了什么事情&#xff09; 计算机网络出现的…

简单记录一下怎么看package.json文件

首先每个vue工程文件从仓库克隆代码下来的时候&#xff0c;一般都会包含这个文件&#xff0c;这个文件非常重要&#xff0c;package.json包含了关于项目重要信息&#xff0c;如下图所示 其中包含了name、version、description、author、scripts、dependencies、devDependencies…

Django基础

Django 1.项目的创建 创建项目&#xff1a; 删除一些内容&#xff1a; settings.py中&#xff1a; 2.默认项目文件的介绍 3.APP 创建APP&#xff1a; APP文件介绍&#xff1a; 4.快速上手 APP注册&#xff1a; 在app中找到apps.py&#xff1a; 在django的项目setti…

海量数据处理

1.给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址&#xff1f; 如何找到top K的IP&#xff1f; 思路&#xff1a;&#xff08;哈希切割&#xff09; 1.ip本身就是一个字符串&#xff0c;先把ip变成一个整数hash(ip) 2.文件的下标index…

用知识图谱打开梁山好汉一百单八将

说起《水浒传》大家一定不会陌生&#xff0c;《水浒传》是一部以描写古代农民起义为题材的长篇小说&#xff0c;全书描写北宋末年以宋江为首的108位好汉在梁山聚义&#xff0c;之后接受招安、四处征战的故事。它的一大看点便是其人物的描写&#xff0c;用金人瑞曾评的话说&…

算法之贪心算法

目录 前言&#xff1a; 如何理解贪心算法&#xff1f; 贪心算法的实战分析 分糖果 钱币找零 问题 总结&#xff1a; 参考资料 前言&#xff1a; 贪心算法有很多经典的应用&#xff0c;比如霍夫曼编码&#xff08;Huffman Coding&#xff09;、Prim 和 Kruskal 最小生成树…

Windows下Jenkins常见问题汇总

Jenkins运行时&#xff0c;场景遇到一些奇怪的问题&#xff0c;特别是在Powershell下能运行的命令&#xff0c;在Jenkins下运行就不行。 原因在于其特殊性&#xff1a;Jenkins执行脚本时&#xff0c;不是用当前Windows的登录账户执行的&#xff0c;所以当前登录账户的很多属性&…

数据库,计算机网络、操作系统刷题笔记16

数据库&#xff0c;计算机网络、操作系统刷题笔记16 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

【码极客精讲】二维数组

二维数组本质上是以数组作为数组元素的数组&#xff0c;即“数组的数组”&#xff0c;类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵&#xff0c;行列数相等的矩阵称为方阵。对称矩阵a[i][j] a[j][i]&#xff0c;对角矩阵&#xff1a;n阶方阵主对角线外都是…

Go语言web极速入门-(Gin+Mysql实现后端接口)

文章目录Gin框架github地址 ⬅️点击此处安装Gin及安装框架超时问题解决参考地址 ⬅️点击此处Mysql操作建表增加测试数据代码实现需要导的包数据库连接函数及常量、数据传输结构体业务代码:获取一条信息(GET请求)业务代码:获取多条信息(GET请求)业务代码:保存一条信息(POST请求…

指令重排现象,多线程情况下,你的代码执行顺序可能不是顺序执行,结果会不一致

一、思考多线程情况下&#xff0c;程序执行顺序是否是按顺序执行 首先定义x 0; y 0; a 0; b 0;然后思考a 1;x b;两行代码谁先执行问题&#xff1f; 二、实战测试 2.1 测试逻辑 首先默认为x 0; y 0; a 0; b 0;然后开启两个线程&#xff1b;线程1执行&#xff1a;a…

java 瑞吉外卖day6 移动端 套餐 菜品展示 购物车加减,清空,用户下单

导入用户地址簿相关功能代码 菜品展示 购物车模块 加入购物车&#xff1a; PostMapping("/add") public R add(RequestBody ShoppingCart shoppingCart){//获取当前线程用户的id并设置到shoppingCart中Long currentId BaseContext.getCurrentId();shoppingCart.set…

使用3种不同的算法从倾斜风速计中检索3个风分量(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

如何确保电子招标的透明度、公正性和及时性?

采购的主要目标是确保以竞争的方式及时获得货物、工程和服务&#xff0c;确保资金的最佳价值&#xff0c;同时保持透明度和公正性。特别是在公共或非盈利组织中&#xff0c;他们利用捐助者的资金来完成任务&#xff0c;必须强调透明度、公平性和及时性。因此&#xff0c;更需要…

图像分类:Pytorch图像分类之--AlexNet模型

文章目录前言数据的处理数据集的下载数据集的划分AlexNet介绍程序的实现model.pyDropout()函数train.py数据预处理导入数据集前言 搭建AlexNet来进行分类模型的训练&#xff0c;大致训练流程和图像分类&#xff1a;Pytorch图像分类之–LetNet模型差不多&#xff0c;两者最大的…