千家信息网

Java并发编程中LockSupport的用法是怎样的

发表于:2024-10-01 作者:千家信息网编辑
千家信息网最后更新 2024年10月01日,Java并发编程中LockSupport的用法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、什么是LockSupport?L
千家信息网最后更新 2024年10月01日Java并发编程中LockSupport的用法是怎样的

Java并发编程中LockSupport的用法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1、什么是LockSupport?

LockSupport是用于创建锁和其他同步类的基本线程阻塞原语

2、两类基本API

LockSupport提供了两类最基本的API:

block线程类:一般都是以pack开头的方法名,pack*(...)

pack方法有两个重载的版本:blocker是一个对象,用于指定阻塞哪个对象。不知道的情况,默认以锁对象自己this为blocker

public static void park();public static void park(Object blocker);

拓展parkNanos函数

public static void parkNanos(Object blocker, long nanos) {    if (nanos > 0) {         // 获取当前线程        Thread t = Thread.currentThread();        // 设置Blocker        setBlocker(t, blocker);        // 获取许可,并设置了时间        UNSAFE.park(false, nanos);        // 设置许可,重新设置blocker为null,避免unpack,获取的blocker为之前设置的        setBlocker(t, null);    }}

nanos参数表示相对时间,表示等待多长时间

parkUntil函数:表示在指定的时限前禁用当前线程,deadline参数表示绝对时间,表示指定的时间

public static void parkUntil(Object blocker, long deadline) {    // 获取当前线程    Thread t = Thread.currentThread();    // 设置Blocker    setBlocker(t, blocker);    UNSAFE.park(true, deadline);    // 设置Blocker为null    setBlocker(t, null);}

unBlock线程类:unpack(Thread)

unpack方法用于释放许可,指定线程可以继续运行。

3、LockSupport本质

LockSupport是一个许可的信号量机制,pack消费,unpack放入,放入也是仅一个,不累计。例如,调用unpack放入一个信号量,多次调用,这个是不会累计信号量的,pack调用之后会消费

4、LockSupport例子

例子:如何控制两个线程依次打印1、2、3、4、5、6、…

import java.util.concurrent.locks.LockSupport;public class LockSupportExample {    private static final int total = 10;    private  static int i = 0;    static Thread t1 , t2;    public static void main(String[] args) {        t1 = new Thread(() ->{            while (i < total) {                System.out.println("t1:" + (++i));                LockSupport.unpark(t2);                LockSupport.park();            }        });        t2 = new Thread(() -> {            while (i < total) {                LockSupport.park();                System.out.println("t2:" + (++i));                LockSupport.unpark(t1);            }        });        t1.start();        t2.start();    }}

打印:

t1: 1
t2: 2
t1:3
t2:4
t1:5
t2:6
t1:7
t2:8
t1:9
t2:10

5、LockSupport源码

public class LockSupport {    // Hotspot implementation via intrinsics API    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对象            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); }    }}

pack方法的源码:

public static void park(Object blocker) {    // 获取当前线程    Thread t = Thread.currentThread();    // 设置Blocker    setBlocker(t, blocker);    // 获取许可    UNSAFE.park(false, 0L);    // 重新可运行后再此设置Blocker为null,避免unpack获取到上一个设置的setBlocker(t, blocker);    setBlocker(t, null);}

unpack的源码:

public static void unpark(Thread thread) {    if (thread != null) // 线程为不空        UNSAFE.unpark(thread); // 释放该线程许可}

可以看出,不管是pack的源码还是unpack的源码都是通过Unsafe的底层api实现的

sun.misc.Unsafe可以直接进行底层非安全操作的工具类

主要提供如下操作:

  • 线程挂起与恢复

  • CAS操作

  • 操纵对象属性

  • 操纵数组元素

  • 直接操纵内存

看完上述内容,你们掌握Java并发编程中LockSupport的用法是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

线程 方法 内存 对象 时间 源码 地址 字段 偏移 信号 信号量 编程 两个 例子 内容 函数 参数 底层 更多 问题 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 七护网络技术 软件开发应该注意哪些 怪物猎人世界冰原如何看服务器 网络技术监管手段仍需提高 我的世界服务器计分板文件在哪 软件开发各阶段时间对比 行政审批局网络安全排查总结 双十一数据库笔记 广播电视网络安全岗位职责 怎么确定云顶之弈手游服务器 南通互动博物馆软件开发 西北政法大学网络安全专业 贵州省网络安全市场有多大 网络安全监控室 军事信息网络技术 石家庄德尚网络技术开发公司 一般服务器安装步骤 华为网络安全认证证书哪家服务好 毫米波 仿真软件开发 网络安全主要应用什么编程语言 web操作监控远程服务器 三星s8 改装成服务器 薛城区网络安全保障中心 壹岛互联网科技公司是干嘛的 互联网科技教学 互联网科技产业细分 有没有多线程的数据库 华为高级网络安全工程师薪资待遇 hp amd服务器 数据库导出半年数怎么对比
0