忘记LockSupport怎么用了?那我们举个有趣的小例子,永远记住它!

简介: 忘记LockSupport怎么用了?那我们举个有趣的小例子,永远记住它!

概述

LockSupport是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。和Thread.suspend()相比,它弥补了由于resume()在前发生,导致线程无法继续执行的情况。和Object.wait()方法相比,它不需要先获得某个对象的锁,也不会抛出InterruptedException异常

park()可以阻塞当前线程,其中每一个线程都有一个许可,该许可默认为[不可用]

如果该许可是 [可用] 状态,那么park()方法会立即返回,消费这个许可,将该许可变更为 [不可用] 状态,流程代码可以继续执行。

如果该许可是 [不可用] 状态,那么park()方法将会阻塞;unpark()方法,会将指定线程的一个许可变为 [可用] 状态;

举例解释

为了便于大家理解,我们可以举一个场景,就是A同学想要去食堂打饭(买汉堡),那么这个A同学就相当于我们的线程了。

情况1:当A同学去取汉堡(调用park()方法)的时候,如果取餐台没有汉堡(即:许可为【不可用】状态),则他需要等待(线程阻塞);

情况2:当A同学去取汉堡(调用park()方法)的时候,如果取餐台有汉堡(即:许可为【可用】状态),则他拿走汉堡去吃饭,取餐台又没有汉堡了(许可从【可用】变为【不可用】状态)

情况3:当服务员打算去补餐(调用unpark()方法)的时候,发现取餐台没有汉堡(即:许可为【不可用】状态),则他去后厨拿来一个汉堡,放到取餐台上(许可从【不可用】变为【可用】状态)

情况4:当服务员打算去补餐(调用unpark()方法)的时候,发现取餐台已经有汉堡了(即:许可为【可用】状态),则他就去做别的事情了

为了方便大家理解,请见如下所示:

代码示例

示例一: 先执行unpark()方法再执行park()方法,也不会造成永久卡死线程。如下所示:

示例二: LockSupport.park()还能支持中断。但是它不会抛InterruptedException异常。它只会默默的返回,但是我们可以从Thread.interrupted()等方法获得中断标记。

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的点赞&分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」


目录
打赏
0
0
0
0
80
分享
相关文章
【面试题】Promise只会概念远远不够,还需这17道题目巩固!
【面试题】Promise只会概念远远不够,还需这17道题目巩固!
|
4月前
|
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
304 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
4月前
|
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
222 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
Java多线程的一些基本例子
【5月更文挑战第17天】Java多线程允许并发执行任务。示例1展示创建并启动两个`MyThread`对象,各自独立打印"Hello World"。示例2的`CounterExample`中,两个线程(IncrementThread和DecrementThread)同步地增加和减少共享计数器,确保最终计数为零。这些例子展示了Java线程的基本用法,包括线程同步,还有如Executor框架和线程池等更复杂的用例。
72 0
【C】函数真的难嘛?其实一点也不难,原理很简单。
# 什么是函数 程序是由多个零件组合而成的,而函数就是这种“零件”的一个较小单位。 ## main函数和库函数 C语言程序中,main函数是必不可少的。程序运行的时候,会执行main函数的主题部分。main函数中使用了printf、scanf、puts等函数。由C语言提供的这些为数众多的函数称为库函数。 ## 什么是函数 当然,我们也可以自己创建函数。而实际上,我们也必须亲自动手创建各种函数。下面我们来自己创建一个简单的函数。 创建一个函数,接收两个整数参数,返回较大整数的值。 printf函数和scanf函数等创建得比较好得函数,即使不知道其内容,只要了解使用方法,也可以轻松使用。 ## 函
C真的不难学,不信就看下我关于循环的理解
C真的不难学,不信就看下我关于循环的理解
如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂
本篇 《如何处理 JDK 线程池内线程执行异常》 这篇文章适合哪些小伙伴阅读呢? 适合工作中使用线程池却不知异常的处理流程,以及不知如何正确处理抛出的异常
ES2020 系列:可选链 "?." 为啥出现,我们能用它来干啥?
ES2020 系列:可选链 "?." 为啥出现,我们能用它来干啥?
147 0
ES2020 系列:可选链 "?." 为啥出现,我们能用它来干啥?
面试官:HashMap 中 modCount 变量有什么作用?大部分人都理解错了。。
面试官:HashMap 中 modCount 变量有什么作用?大部分人都理解错了。。
235 0
面试官:HashMap 中 modCount 变量有什么作用?大部分人都理解错了。。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等