LockSupport源码分析
2024-10-08 10:49:17
LockSupport提供park()和unpark()方法实现线程阻塞和唤醒。底层实现是通过sun.misc.Unsafe的park和unpark。
关于sun.misc.Unsafe的说明请参见我的另外一篇博客。
核心就是通过一个信号量(permit)实现的,0阻塞,1继续执行。
park时可以指定blocker以及阻塞时长或者阻塞到什么时间点,通过UNSAFE.park第一个boolean参数决定,true指定时间,false指定时长。
可以先执行unpark,再执行part的时候发现之前unpark设置为1了,直接继续执行,并设置信号量为0。
park时除了unpark或者时间到了的情况外,阻塞的线程也会被其他线程调用该线程的interrupt方法中断并立即返回,
该过程不会抛出异常,所以调用者需要检查线程状态,是怎样的方式被唤醒的。
park的注释说明如下:
This method does <em>not</em> report which of these caused the
method to return. Callers should re-check the conditions which caused
the thread to park in the first place.
与wait的区别:
wait需要获取对象锁,LockSupport不需要;
wait挂起的是当前线程,属于随机性,唤醒notify,notifyAll也是随机的,LockSupport直接控制的是线程,指定线程park,指定线程unpark或interrupt
最新文章
- jquery和Js的区别和基础操作
- 改变BootStrap主题颜色
- CMD魔法堂:获取进程路径和PID值的方法集
- grep, sed, awk
- 改变了Tomcat路径后无法卸载和重装的解决办法
- Python学习路程day6
- 初识ASP.NET---若干常见错误
- HDU 2594 (简单KMP) Simpsons’ Hidden Talents
- MongoDB 复制集(二) 选举 自动故障切换
- C# MVC 自学笔记—2 MVC Movie简介
- 猎八哥浅谈MYSQL触发器
- 有趣的冷知识:编程中Foo, Bar 到底什么意思?
- 方便快捷的求导求积分解方程在线工具sage介绍
- 1.1.10 word2010图片另存为存到图片库里,怎么修改之
- WPF中的Bitmap与byte
- 找第二大的数SQL-Second Highest Salary
- CentOS Linux更改MySQL数据库目录位置具体操作
- JMeter做http接口压力测试
- 开源一个Java Class实现Openfire登陆、推出、消息发送,方便其他系统集成IM功能了
- Opencv博文收藏列表
热门文章
- Mac系统升级后git没法使用的问题
- Educational Codeforces Round 76 (Rated for Div. 2) B. Magic Stick
- Docker - Docker Engine 结构结构概述
- VIM - 问题: 简单变换
- P&;R 7
- Kali2.0中peda与pwntools的安装
- 前端开发:mock.js的简单应用(生成随机数据,拦截 Ajax 请求)
- Azure IoT Hub 十分钟入门系列 (3)- 使用消息路由将原始设备数据记录存档
- 前端一面/面试常考题1-页面布局:假设高度已知,请写出三栏布局,其中左栏、右栏宽度各为300px,中间自适应。
- list-style: none;