LockSupport
来源:互联网 发布:美团外卖商家mac版本 编辑:程序博客网 时间:2024/05/20 00:52
转载自:
http://blog.csdn.net/hengyunabc/article/details/28126139
http://www.jb51.net/article/88395.htm
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程。
LockSupport 很类似于二元信号量(只有1个许可证可供使用),如果这个许可还没有被占用,当前线程获取许可并继续执行;如果许可已经被占用,当前线程阻塞,等待获取许可。这个“许可”是不能叠加的,“许可”是一次性的。比如线程B连续调用了三次unpark函数,当线程A调用park函数就使用掉这个“许可”,如果线程A再次调用park,则进入等待状态。
注意,unpark函数可以先于park调用。比如线程B调用unpark函数,给线程A发了一个“许可”,那么当线程A调用park时,它发现已经有“许可”了,那么它会马上再继续运行。
实际上,park函数即使没有“许可”,有时也会无理由地返回,这点等下再解析。
在Java5里是用wait/notify/notifyAll来同步的。wait/notify机制有个很蛋疼的地方是,比如线程B要用notify通知线程A,那么线程B要确保线程A已经在wait调用上等待了,否则线程A可能永远都在等待。另外,是调用notify,还是notifyAll?notify只会唤醒一个线程,如果错误地有两个线程在同一个对象上wait等待,那么又悲剧了。为了安全起见,貌似只能调用notifyAll了。
park/unpark模型真正解耦了线程之间的同步,线程之间不再需要一个Object或者其它变量来存储状态,不再需要关心对方的状态。
基本用法
LockSupport.park(); System.out.println("block.");
运行该代码,可以发现主线程一直处于阻塞状态。因为当前没有许可,调用park()时获取不到许可,所以进入阻塞状态。
如下代码:先释放许可,再获取许可,主线程能够正常终止。
LockSupport.unpark(Thread.currentThread());//释放许可 LockSupport.park();// 获取许可 System.out.println("block.");
LockSupport许可的获取和释放,一般来说是对应的,如果多次unpark,只有一次park也不会出现什么问题,结果是许可处于可用状态。但是LockSupport是可不重入的,如果一个线程连续2次调用LockSupport.park(),那么该线程一定会一直阻塞下去。
简单示例
import java.util.concurrent.locks.LockSupport;public class LockSupportTest1 { private static Thread mainThread; public static void main(String[] args) { ThreadA ta = new ThreadA("ta"); // 获取主线程 mainThread = Thread.currentThread(); System.out.println(Thread.currentThread().getName()+" start ta"); ta.start(); System.out.println(Thread.currentThread().getName()+" block"); // 主线程阻塞 LockSupport.park(mainThread); System.out.println(Thread.currentThread().getName()+" continue"); } static class ThreadA extends Thread{ public ThreadA(String name) { super(name); } public void run() { System.out.println(Thread.currentThread().getName()+" wakup others"); // 唤醒“主线程” LockSupport.unpark(mainThread); } }}
- LockSupport
- LockSupport
- LockSupport
- LockSupport
- LockSupport
- java LockSupport
- java LockSupport
- Java LockSupport
- LockSupport 相关
- LockSupport类
- LockSupport使用
- LockSupport源码分析
- 读LockSupport源码
- Thread.interrupt与LockSupport
- LockSupport源码探索
- java基础线程-LockSupport
- LockSupport的使用
- 03.JUC 锁 - LockSupport
- C++笔试题(剑指offer 面试题2 自己的string类)
- MySQL索引总结
- JavaScript的变量作用域和闭包操作
- 前后端分离开发的介绍、原因、相关案例
- MVC模型构建管理系统
- LockSupport
- Dalivik垃圾回收收机制Cocurrent GC简介
- 约束布局解析
- vue-quill-editor自定义图片上传
- 机器学习----特征工程
- openwrt系统+ 交叉编译mosquitto
- 图片框架 三重更新 联网解析json设置默认图片以及图片圆角弧度 储存到sd卡
- Android移动开发-检测点击按键事件的实现
- git 添加权限管理gitolite