LockSupport类中的park()和unpark()
使用
LockSupport.park()用来阻塞线程;LockSupport.unpark(t1)用来唤醒特定线程;
public static void main(String[] args) {Thread t1 = new Thread(() -> {log.debug("start...");sleep(1);log.debug("park...");// 线程t1进入等待状态LockSupport.park();log.debug("resume...");}, "t1");t1.start();sleep(2);log.debug("unpark...");// 主线程 重新唤醒线程t1LockSupport.unpark(t1);}
park()和wait()的比较
- wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
- park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】
- park & unpark 可以先 unpark,而 wait & notify 不能先 notify
底层原理分析
- 当前线程调用 Unsafe.park() 方法
- 检查 _counter ,本情况为 0,这时,获得 _mutex 互斥锁
- 线程进入 _cond 条件变量阻塞
- 设置 _counter = 0
总结:调用Unsafe.park() 时,如果_counter是0就进入阻塞状态,并且把_counter设置为0;
- 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
- 唤醒 _cond 条件变量中的 Thread_0
- Thread_0 恢复运行
- 设置 _counter 为 0
总结:调用Unsafe.unpark(Thread_0),会将 _counter 设置为 1,随即唤醒了该线程,线程唤醒之后便又将该值设置为0
如果先执行unpark方法,再执行到了park()方法呢?
- 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
- 当前线程调用 Unsafe.park() 方法
- 检查 _counter ,本情况为 1,这时线程无需阻塞,继续运行
- 设置 _counter 为 0
这两个方法是不释放锁的
public class ParkDemo {private static Object object = new Object();public static void main(String[] args) throws InterruptedException {Thread t1 =new Thread(){@Overridepublic void run() {synchronized (object) {System.out.println("线程1进入临界区");LockSupport.park();System.out.println("继续执行");}}};t1.start();TimeUnit.SECONDS.sleep(5);synchronized (object) {System.out.println("进入临界区");}}
}
LockSupport类中的park()和unpark()相关推荐
- JDK1.8 Unsafe类中的park和unpark方法解析
park是Unsafe类中的native方法,LockSupport类通过调用Unsafe类的park和unpark提供了几个操作.Unsafe的park方法如下 public native void ...
- LockSupport 中的 park 与 unpark
在代码中调用 LockSupport.park() 时,会阻塞当前线程的执行. AtomicBoolean status = new AtomicBoolean(false);Thread waite ...
- java unpark_LockSupport中的park与unpark原理
LockSupport是用来创建locks的基本线程阻塞基元,比如AQS中实现线程挂起的方法,就是park,对应唤醒就是unpark.JDK中有使用的如下 LockSupport提供的是一个许可,如果 ...
- java lock park_java并发编程-LockSupport中park与unpark基本使用与原理简单分析
文章目录 java并发编程原理之---park与unpark 基本使用 情况一,先park再unpark,代码举例与分析 情况二,先unpark再park,代码举例与分析 特点 原理之park &am ...
- LockSupport的park和unpark
LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语. Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Lo ...
- LockSupport 以及 park、unpark 方法
一.LockSupport 是 jsr 166 中新增的 juc 工具类. LockSupport 类主要用于创建锁和其他同步类来实现线程阻塞. 这个类与他使用的每个线程进行关联, 如果可用就立即 p ...
- Java LockSupport以及park、unpark方法源码深度解析
介绍了JUC中的LockSupport阻塞工具以及park.unpark方法的底层原理,从Java层面深入至JVM层面. 文章目录 1 LockSupport的概述 2 LockSupport的特征和 ...
- java帐篷_Java多线程之 Park和Unpark(十四)
介绍 Park 和 Unpark 均是 LockSupport 类中的方法 //暂停当前线程 LockSupport.park(); //恢复某个线程 LockSupport.unpark(暂停线程对 ...
- 详解Java多线程编程中LockSupport类的线程阻塞用法
转载自 详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...
- LockSupport的park和unpark的原理
我们知道各种并发框架如CountDownLatch.CyclicBarrier和Semaphore是基于AQS (AbstractQueuedSynchronizer)框架实现的,AQS框架借助于两个 ...
最新文章
- 数据库本地服务器为空,本地搭建的服务器访问不到数据库数据
- JPA实体关联关系,一对一以及转换器
- 并行编程——内存模型之缓存一致性
- Eigen(1)配置VS2015
- mysql的zip包的安装方法
- 「ng2」json组装和解析
- vim 快捷键 总结-编辑文件
- 风之大陆ios android账号互通,《风之大陆》安卓和ios互通吗
- C1驾照到期更换,驾照异地入迁,摩托驾驶证报名,记录
- bmp格式的图片怎么转jpg格式?怎么快速转图片格式?
- Photoshop CC 2017工具的使用
- 记录自己需要读的几本书
- Python学习笔记 -一到五
- html li 圆点 大小,ul li 定制圆点,list-style-image调整图片圆点大小 与 文字和图片排版...
- Cortex-M系列处理器对比
- JS 删除字符串中所有的数字
- DaVinci:跟踪器 - 窗口
- 无效的 ProgID“ShockwaveFlash.ShockwaveFlash” 导入 progid 时遇到错误: “ShockwaveFlash.ShockwaveFlash”
- python程序运行结果始终为0_下列Python程序的运行结果是
x=0
y=True
print(xy and \'A\'\'B\')...
- Halcon评价图像清晰度的算子
热门文章
- 卡方检验2-python代码实现
- cmd查看mysql版本_mysql安装-必会
- 为什么必须在主线程操作UI
- The Basic Knowledge of Graph(图的基本知识)
- 137.只出现一次的数字II
- php5.6软件下载,【PHP下载】PHP for Linux 5.6.6-ZOL软件下载
- 钉钉微应用怎么进入_海目星激光张荣:激光焊接在锂电池生产应用中越来越多...
- SRMD:Learning a Single Convolutional Super-Resolution Network for Multiple Degradations
- leetcode485、448、414
- Dropout浅层理解