十七、LockSupport

2024-03-23 17:52
文章标签 十七 locksupport

本文主要是介绍十七、LockSupport,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TestLockSupport

  • 淘宝面试题:实现一个容器,提供两个方法,add,size。写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束
  • 面试题:写一个固定容量同步容器,拥有put和get方法,以及 getcount方法,能够支持2个生产者线程以及10个消费者线程的阻塞调用
  • 源码阅读技巧
  • AQS源码解析
     

LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。

它的内部其实两类主要的方法:park(停车阻塞线程)和unpark(启动唤醒线程)。

每个1秒钟打印一个数字出来,当i = 5 的时候,当前线程停止‘’

 LockSupport.unpark(t);和主线程同步进行,unpark可以先与于park使用

package com.mashibing.juc.c_020;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;public class T13_TestLockSupport {public static void main(String[] args) {Thread t = new Thread(()->{for (int i = 0; i < 10; i++) {System.out.println(i);if(i == 5) {LockSupport.park();}try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();LockSupport.unpark(t);try {TimeUnit.SECONDS.sleep(8);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("after 8 senconds!");LockSupport.unpark(t);}
}

注意上面的123方法,都有一个blocker,这个blocker是用来记录线程被阻塞时被谁阻塞的。用于线程监控和分析工具来定位原因的。

现在我们知道了LockSupport是用来阻塞和唤醒线程的,而且之前相信我们都知道wait/notify也是用来阻塞和唤醒线程的,那么它相比,LockSupport有什么优点呢?

上面这段代码的意思是,我们定义一个线程,但是在内部进行了park,因此需要unpark才能唤醒继续执行,不过上面,我们在MyThread进行的park,在main线程进行的unpark。 

这样来看,好像和wait/notify没有什么区别。那他的区别到底是什么呢?这个就需要仔细的观察了。这里主要有两点:

(1)wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,但是park不需要获取某个对象的锁就可以锁住线程。

(2)notify只能随机选择一个线程唤醒,无法唤醒指定的线程,unpark却可以唤醒一个指定的线程。

unpark其实就相当于一个许可,告诉特定线程你可以停车,特定线程想要park停车的时候一看到有许可,就可以立马停车继续运行了。因此其执行顺序可以颠倒。

当调用park时,先尝试直接能否直接拿到“许可”,即_counter>0时,如果成功,则把_counter设置为0,并返回。

如果不成功,则构造一个ThreadBlockInVM,然后检查_counter是不是>0,如果是,则把_counter设置为0,unlock mutex并返回:

否则,再判断等待的时间,然后再调用pthread_cond_wait函数等待,如果等待返回,则把_counter设置为0,unlock mutex并返回:

这就是整个park的过程,总结来说就是消耗“许可”的过程。

这篇关于十七、LockSupport的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/839093

相关文章

ASP.NET Core 入门教学十七 GraphQL入门指南

GraphQL 是一种用于 API 的查询语言,允许客户端请求所需的数据,并能够合并多个资源到一个请求中。在 ASP.NET Core 中使用 GraphQL 可以提供更灵活、高效和实用的数据查询方式。以下是 ASP.NET Core 中 GraphQL 的入门指南: 1. 安装必要的 NuGet 包 首先,你需要安装以下 NuGet 包: GraphQLGraphQL.Server.Tra

Flink实战案例(十七):Flink 异步IO (二)原理

1 原理实现 AsyncDataStream.(un)orderedWait方法的主要工作就是创建了一个 AsyncWaitOperator。AsyncWaitOperator 是支持异步 IO 访问的算子实现,该算子会运行 AsyncFunction 并处理异步返回的结果,其内部原理如下图所示:   如图所示,AsyncWaitOperator 主要由两部分组成:StreamElem

【硬刚ES】ES基础(十七)结构化搜索

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

【MySQL】Explain执行计划(十七)

🚗MySQL学习·十七站~ 🚩本文已收录至专栏:MySQL通关路 ❤️每章节附章节思维导图,文末附全文思维导图,感谢各位点赞收藏支持~ ⭐学习汇总贴,超详细思维导图:【MySQL】学习汇总(完整思维导图) 一.引入 当我们需要对SQL语句进行优化时必须先分析其性能时,EXPLAIN是一个不可或缺的神器,它可以帮助我们获取 MySQL 如何执行 SELECT 语句的信息,例如 表如何

【Unity 3D】学习笔记十七:自定义游戏中字体

在已开发出来的游戏里,总有些好看的字体,来增加的游戏的趣味性。此时,系统自带的默认字体就显得有些砢碜了。Unity支持所有的.tff的字集,默认的是Arial。 在改变字体设置前,需要得到一个.tff的字符集。可以选择去网上下,也可以直接复制电脑中的字符集。将字符集拖放只Unity的工程文件夹下就行。然后再project视图中选择create——GUI Skin 创建一个GUI皮肤来设置我

非标独立设计选型--十七--滚珠丝杆选型计算

螺纹种类:锁紧螺纹、传动螺纹                      自锁性        高效率 传动螺纹:滑动丝杆、滚珠丝杆 滑动丝杆(梯形丝杆):纯滑动摩擦--黄铜(自润滑性好)效率很低60%,结构简单成本低--没有精度可言---线接触--大负载---启动阻力大导致超低速运行时出现爬行蠕动现象 没有精度要求,需要较大的轴向负载,预算较低需要降低成本,低速运行,不重要场合 1、手摇调节机

十七、模拟 实现栈和队列类

Ⅰ . 模拟实现 stack 01 实现思路 插入数据删除数据这些逻辑其实没有必要自己实现,而是采用转换的方式 之前我们讲解了适配器的知识,这里采用的就是一些其他的适配的容器去实现 至于转换什么,我们可以进一步想到,好像有很多容器适合去转换 所以 STL 中增加了一个模板参数 Container,利用 Container 来进行转换 上一章末尾,我们利用了 deque 去实现栈和队列

【git之窗】(十七)线上问题如何拉取紧急分支

一、前提       通常使用git,都会在上线前把代码合并到master分支,在master上打好tag,由上线tag、回退tag确保上线正常。       例如:       上线tag: VINCENT_tag_V1.3.1       回滚tag: VINCENT_tag_V1.3.0   二、问题      如上所述,如果master上线的tag(VINCENT_tag_V

ExtJs 入门教程十七[项目 :items]

一、语法 items:[{layout:'column',//布局值为:column、formautoHeight:true,xtype:'fieldset',//见说明[1]style:'padding-top:10px;',items:[{columnWidth:.5,//列宽layout:'form',items:[{xtype:'combo',inputType: 'password',

(十七)Flink 容错机制

目录 分布式快照 Checkpoint Checkpoint 模式 Checkpoint 配置 非对齐 Checkpointing 状态存储 Savepoint 分配算子 ID Savepoint 操作 Checkpoint 与 Savepoint 区别 作业重启与故障恢复策略 重启策略 恢复策略 对于不间断 24 小时运行的程序来说,容错至关重要。Flink 定期