忘记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^)/ ~ 「干货分享,每天更新」


相关文章
|
1月前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
107 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
1月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
112 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
6月前
|
Java 测试技术
Java多线程的一些基本例子
【5月更文挑战第17天】Java多线程允许并发执行任务。示例1展示创建并启动两个`MyThread`对象,各自独立打印"Hello World"。示例2的`CounterExample`中,两个线程(IncrementThread和DecrementThread)同步地增加和减少共享计数器,确保最终计数为零。这些例子展示了Java线程的基本用法,包括线程同步,还有如Executor框架和线程池等更复杂的用例。
60 0
|
6月前
解释一下什么是VIF。
解释一下什么是VIF。
659 0
对于async和await的使用方式、作用效果不怎么理解 ?没关系,初步看这篇就够了
对于async和await的使用方式、作用效果不怎么理解 ?没关系,初步看这篇就够了
如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂
本篇 《如何处理 JDK 线程池内线程执行异常》 这篇文章适合哪些小伙伴阅读呢? 适合工作中使用线程池却不知异常的处理流程,以及不知如何正确处理抛出的异常
|
前端开发 API
我明白了,前端并发函数
谷歌浏览器的并发数是6个,有六个请求正在处理,那么其它的任务就会排队,等六个请求任务中的某一个完成之后,就会立马插入进去执行。这样一来,就清楚了。
192 0
我明白了,前端并发函数
|
Java 调度
Java线程同步(含详细解释/代码实例)
Java线程同步(含详细解释/代码实例)
237 0
Java线程同步(含详细解释/代码实例)
|
存储 Java
来自三段代码的疑惑~
来自三段代码的疑惑~
115 0