Java多线程系列——线程阻塞工具类LockSupport
简述
LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。
和 Thread.suspend()相比,它弥补了由于 resume()在前发生,导致线程无法继续执行的情况。
和 Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出 InterruptedException 异常。
LockSupport 的静态方法 park()可以阻塞当前线程,类似的还有 parkNanos()、parkUntil()等方法。它们实现了一个限时等待,如下图所示:

实例
import java.util.concurrent.locks.LockSupport;
/**
* Created by zhengbinMac on 2017/3/5.
*/
public class SuspendResumeTest {
public static Object object = new Object();
static TestThread t1 = new TestThread("线程1");
static TestThread t2 = new TestThread("线程2");
public static class TestThread extends Thread{
public TestThread(String name) {
super.setName(name);
}
@Override
public void run() {
synchronized (object) {
System.out.println(getName()+" 占用。。");
// Thread.currentThread().suspend();
LockSupport.park();
System.out.println(Thread.currentThread().getName()+" 执行结束!");
}
}
}
public static void main(String[] args) throws InterruptedException {
t1.start();
Thread.sleep(200);
t2.start();
// t1.resume();
LockSupport.unpark(t1);
LockSupport.unpark(t2);
// t2.resume();
t1.join();
t2.join();
}
}
代码只是对Java多线程——过期的suspend()挂起、resume()继续执行线程中实例稍作修改,将 suspend()和 resume()改为 park()与 unpark()。
修改后,同样的问题:我们依然无法保证 unpark()方法发生在 park()之后,但是多次执行代码,发现始终都可以正常结束,不会因为两方法的顺序导致线程永久性挂起。
这是因为,其使用类似信号量的机制。
它为每个线程准备了一个许可,如果许可可用,那么 park()方法立即返回,并消费这个许可(将许可变为不可用);如果许可不可用,则阻塞。
而 unpark()方法,则是使一个许可变为可用。
上述特点使得:即使 unpark()操作发生在 park()之前,它也可以使下一次得 park()操作立即返回。这是上述实例代码顺利结束的原因。
同时,park()挂起的线程不会像 suspend()那样线程状态为 RUNNABLE,park()会明确给出 WAITING 状态,并标注由 park()引起,如下图所示:

这个标注,使得分析问题时更加方便,可以使用 park(Object)方法,为当前线程设置一个阻塞对象,这个阻塞对象会出现在线程 Dump 中。
将实例中 18 行改为:
LockSupport.park(this);
jstack 输出为:

参考资料
[1] 实战Java高并发程序设计, 3.1.7 - 线程阻塞工具类:LockSupport
[2] Java并发编程的艺术, 5.5 - LockSupport工具
Java多线程系列——线程阻塞工具类LockSupport的更多相关文章
- 挂起(suspend)与线程阻塞工具类LockSupport
挂起(suspend)与线程阻塞工具类LockSupport 一般来说是不推荐使用suspend去挂起线程的,因为suspend在导致线程暂停的同时,并不会去释放任何锁资源. 如果其他任何线程想要访问 ...
- 线程阻塞工具类:LockSupport(读书笔记)
他可以在线程任意位置让线程阻塞, LockSupport的静态方法park()可以阻塞当前线程,类似的还有parkNanos() ParkUntil()等,他们实现了一个限时等待 public cl ...
- AQS 框架之 LockSupport 线程阻塞工具类
■ 前言 并发包一直是 JDK 里面比较难理解的,同时也是很精美的语言,膜拜下 Doug Li 大神.作者不敢长篇大论,只求循序渐进地把并发包通过理论和实战 (代码) 的方式介绍给大家. 其实做每一件 ...
- 3.1.7 线程阻塞工具类:LockSupport
package 第三章.线程阻塞工具LockSupport; import java.util.concurrent.locks.LockSupport; /** * Created by zzq o ...
- Java多线程系列--“JUC锁”07之 LockSupport
概述 本章介绍JUC(java.util.concurrent)包中的LockSupport.内容包括:LockSupport介绍LockSupport函数列表LockSupport参考代码(基于JD ...
- java多线程10:并发工具类CountDownLatch、CyclicBarrier和Semaphore
在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码. 本文分别介绍Coun ...
- java多线程无锁和工具类
1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...
- Java多线程系列——线程池原理之 ThreadPoolExecutor
ThreadPoolExecutor 简介 ThreadPoolExecutor 是线程池类. 通俗的讲,它是一个存放一定数量线程的线程集合.线程池允许多个线程同时运行,同时运行的线程数量就是这个线程 ...
- Java多线程系列-线程创建
1.怎样创建多线程? Java从语言级别实现多线程,因此实现一个多线程程序很easy.有两种方法能够实现多线程,即继承Thread类和实现Runnable接口.由于Java不支持多继承的原因,建议尽可 ...
随机推荐
- Web大前端面试题-Day6
1.请说明ECMAScript, JavaScript, Jscript之间的关系? ECMAScript提供脚本语言必须遵守的规则. 细节和准则,是脚本语言的规范. 比如:ES5,ES6就是具体的一 ...
- nowcoder提高组2题解
T1 化一下试子就ok code #include<cstdio> #include<algorithm> inline long long read() { long lon ...
- Python3字符串-最容易理解的方式
字符串的创建 字符串创建符号 ' ' " " ''' ''' """ """ 转义符\ >>> str ...
- 关于Android studio团队协同开发连接到已有项目
当团队中已经有人创建好项目的时候,队员想把自己的as与码云上项目相互连接时,有两种方法: 方法一: 进入as初始页面: 分别点击:check out project from Version cont ...
- ios真机调试错误解决:Installation of apps is prohibited by a policy on the device
该问题的出现原因是手机中的访问权限被关闭了,打开方法如下: 设置->通用->访问限制->安装应用程序
- spring源码分析系列 (8) FactoryBean工厂类机制
更多文章点击--spring源码分析系列 1.FactoryBean设计目的以及使用 2.FactoryBean工厂类机制运行机制分析 1.FactoryBean设计目的以及使用 FactoryBea ...
- Asp.Net Mvc 自定义扩展
目录: 自定义模型IModelBinder 自定义模型验证 自定义视图引擎 自定义Html辅助方法 自定义Razor辅助方法 自定义Ajax辅助方法 自定义控制器扩展 自定义过滤器 自定义Action ...
- C# 格式化新招
C# 格式化新招 ) from Attribute_Item where AttributeSysNo=$AttributeSysNo and Name='$Name' and SysNo !=$Sy ...
- Oozie分布式工作流——从理论和实践分析使用节点间的参数传递
Oozie支持Java Action,因此可以自定义很多的功能.本篇就从理论和实践两方面介绍下Java Action的妙用,另外还涉及到oozie中action之间的参数传递. 本文大致分为以下几个部 ...
- 什么是SASS
一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一 ...