忘记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`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
116 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
1月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
122 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
6月前
|
Java 测试技术
Java多线程的一些基本例子
【5月更文挑战第17天】Java多线程允许并发执行任务。示例1展示创建并启动两个`MyThread`对象,各自独立打印"Hello World"。示例2的`CounterExample`中,两个线程(IncrementThread和DecrementThread)同步地增加和减少共享计数器,确保最终计数为零。这些例子展示了Java线程的基本用法,包括线程同步,还有如Executor框架和线程池等更复杂的用例。
61 0
|
3月前
|
编译器
回答两个被频繁问到的代码写法问题
回答两个被频繁问到的代码写法问题
33 0
|
6月前
|
设计模式 算法 Java
|
前端开发 API
我明白了,前端并发函数
谷歌浏览器的并发数是6个,有六个请求正在处理,那么其它的任务就会排队,等六个请求任务中的某一个完成之后,就会立马插入进去执行。这样一来,就清楚了。
193 0
我明白了,前端并发函数
|
移动开发 缓存 ARouter
没错,TheRouter 是我写的
大约在17年底到18年初的时候,我经常会讲一些当时做模块化开发的心得和踩坑历程
223 0
|
Java 调度
Java线程同步(含详细解释/代码实例)
Java线程同步(含详细解释/代码实例)
239 0
Java线程同步(含详细解释/代码实例)
|
存储 Java
来自三段代码的疑惑~
来自三段代码的疑惑~
115 0
多线程顺序运行的 4 种方法,面试随便问!
多线程顺序运行的 4 种方法,面试随便问!
246 0