Java并发编程中的LockSupport类怎么用
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍"Java并发编程中的LockSupport类怎么用"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Java并发编程中的LockSupport类
千家信息网最后更新 2025年11月13日Java并发编程中的LockSupport类怎么用
这篇文章主要介绍"Java并发编程中的LockSupport类怎么用"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Java并发编程中的LockSupport类怎么用"文章能帮助大家解决问题。
一、LockSupport类的属性
private static final sun.misc.Unsafe UNSAFE; // 表示内存偏移地址 private static final long parkBlockerOffset; // 表示内存偏移地址 private static final long SEED; // 表示内存偏移地址 private static final long PROBE; // 表示内存偏移地址 private static final long SECONDARY; static { try { // 获取Unsafe实例 UNSAFE = sun.misc.Unsafe.getUnsafe(); // 线程类类型 Class> tk = Thread.class; // 获取Thread的parkBlocker字段的内存偏移地址 parkBlockerOffset = UNSAFE.objectFieldOffset(tk.getDeclaredField("parkBlocker")); // 获取Thread的threadLocalRandomSeed字段的内存偏移地址 SEED = UNSAFE.objectFieldOffset(tk.getDeclaredField("threadLocalRandomSeed")); // 获取Thread的threadLocalRandomProbe字段的内存偏移地址 PROBE = UNSAFE.objectFieldOffset(tk.getDeclaredField("threadLocalRandomProbe")); // 获取Thread的threadLocalRandomSecondarySeed字段的内存偏移地址 SECONDARY = UNSAFE.objectFieldOffset(tk.getDeclaredField("threadLocalRandomSecondarySeed")); } catch (Exception ex) { throw new Error(ex); } }二、LockSupport类的构造函数
// 私有构造函数,无法被实例化 private LockSupport() { }三、park(Object blocker)方法 和 park()方法分析
//调用park函数时,当前线程首先设置好parkBlocker字段,然后再调用 Unsafe的park函数 // 此后,当前线程就已经阻塞了,等待该线程的unpark函数被调用,所以后面的一个 setBlocker函数无法运行 // unpark函数被调用,该线程获得许可后,就可以继续运行了,也就运行第二个 setBlocker // 把该线程的parkBlocker字段设置为null,这样就完成了整个park函数的逻辑。 // 总之,必须要保证在park(Object blocker)整个函数 执行完后,该线程的parkBlocker字段又恢复为null。 //阻塞当前线程,并且将当前线程的parkBlocker字段设置为blocker public static void park(Object blocker) { // 获取当前线程 Thread t = Thread.currentThread(); //将当前线程的parkBlocker字段设置为blocker setBlocker(t, blocker); //阻塞当前线程,第一个参数表示isAbsolute,是否为绝对时间,第二个参数就是代表时间 UNSAFE.park(false, 0L); //重新可运行后再此设置Blocker setBlocker(t, null); } //无限阻塞线程,直到有其他线程调用unpark方法 public static void park() { UNSAFE.park(false, 0L); }四、parkNanos(Object blocker,long nanos)方法 和 parkNanos(long nanos)方法分析
//阻塞当前线程nanos秒 毫秒 public static void parkNanos(Object blocker, long nanos) { //先判断nanos是否大于0,小于等于0都代表无限等待 if (nanos > 0) { // 获取当前线程 Thread t = Thread.currentThread(); //将当前线程的parkBlocker字段设置为blocker setBlocker(t, blocker); //阻塞当前线程现对时间的nanos秒 UNSAFE.park(false, nanos); //将当前线程的parkBlocker字段设置为null setBlocker(t, null); } } //阻塞当前线程nanos秒 毫秒 public static void parkNanos(long nanos) { if (nanos > 0) UNSAFE.park(false, nanos); }五、parkUntil(Object blocker,long deadline)方法 和 parkUntil(long deadline)方法分析
//将当前线程阻塞绝对时间的deadline秒,并且将当前线程的parkBlockerOffset设置为blocker public static void parkUntil(Object blocker, long deadline) { //获取当前线程 Thread t = Thread.currentThread(); //设置当前线程parkBlocker字段设置为blocker setBlocker(t, blocker); //阻塞当前线程绝对时间的deadline秒 UNSAFE.park(true, deadline); //当前线程parkBlocker字段设置为null setBlocker(t, null); } //将当前线程阻塞绝对时间的deadline秒 public static void parkUntil(long deadline) { UNSAFE.park(true, deadline); }六、setBlocker(Thread t, Object arg)和 getBlocker(Thread t) 方法分析
// 设置线程t的parkBlocker字段的值为arg private static void setBlocker(Thread t, Object arg) { UNSAFE.putObject(t, parkBlockerOffset, arg); } //获取当前线程的Blocker值 public static Object getBlocker(Thread t) { //若当前线程为空就抛出异常 if (t == null) throw new NullPointerException(); //利用unsafe对象获取当前线程的Blocker值 return UNSAFE.getObjectVolatile(t, parkBlockerOffset); }七、unpark(Thread thread) 方法分析
//释放该线程的阻塞状态,即类似释放锁,只不过这里是将许可设置为1 public static void unpark(Thread thread) { // 线程为不空 if (thread != null) // 释放该线程许可 UNSAFE.unpark(thread); }八、LockSupport优点
LockSupport比Object的wait/notify有两大优势
1.LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,实现了线程间的解耦。
2.unpark函数可以先于park调用,所以不需要担心线程间的执行的先后顺序。
关于"Java并发编程中的LockSupport类怎么用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
线程
字段
阻塞
函数
方法
内存
地址
偏移
时间
分析
运行
编程
知识
代表
参数
实例
对象
行业
同步
不同
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
cbt服务器
直销制度软件开发
平台数据库核查的通知
云桌面服务器及软件
华为c 软件开发
郑州app软件开发价钱是多少
银行业如何加强网络安全管理
js 访问web数据库吗
四子王旗网络安全应急指挥中心
赛纳打印科技有限公司软件开发
组态王和mysql数据库
数据库做参考文献
猫和老鼠不同服务器能用吗
计算机网络技术整理
创建选课数据库的代码
堪雍商业软件开发有限
服务器开启全部端口安全吗
什么是网络安全的核心
工信部网络安全信息处
软件开发学校里面有什么专业
云求职网络技术怎么样
服务器管理器报错复位
5g 教育专网 网络安全
代码生成器与服务器代理
网络技术证书培训学校
蓝山县网络安全
php 遍历输出数据库
重庆联通服务器租用推荐云空间
网络安全等级保障情况
软件开发怎么单干