文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-25 17:16

关注

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可以直接进行底层非安全操作的工具类

主要提供如下操作:

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯