返回顶部
首页 > 资讯 > 精选 >Java LockSupport常用方法有哪些
  • 651
分享到

Java LockSupport常用方法有哪些

2023-07-05 04:07:38 651人浏览 八月长安
摘要

这篇文章主要讲解了“Java LockSupport常用方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java LockSupport常用方法有哪些”吧!Loc

这篇文章主要讲解了“Java LockSupport常用方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java LockSupport常用方法有哪些”吧!

LockSupport类常用方法源码

LockSupport只是一个简单的基础类,位于java.util.concurrent.locks包下,多用于线程的阻塞和唤醒,因此LockSupport也被称为其他线程的工具类。

LockSupport类的源码有标注,LockSupport类无法实例化。LockSupport类的底层是有Unsafe类实现的,LockSupport加载时的初始化也用到了Unsafe获取成员的偏移量,其源码如下:

    // 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 = sun.misc.Unsafe.getUnsafe();            Class<?> tk = Thread.class;            parkBlockerOffset = UNSAFE.objectFieldOffset                (tk.getDeclaredField("parkBlocker"));            SEED = UNSAFE.objectFieldOffset                (tk.getDeclaredField("threadLocalRandomSeed"));            PROBE = UNSAFE.objectFieldOffset                (tk.getDeclaredField("threadLocalRandomProbe"));            SECONDARY = UNSAFE.objectFieldOffset                (tk.getDeclaredField("threadLocalRandomSecondarySeed"));        } catch (Exception ex) { throw new Error(ex); }    }

LockSupport类中有一些核心的线程操作方法,多用于线程的阻塞与唤醒。

调用park()方法使线程阻塞:

    public static void park(Object blocker) {        Thread t = Thread.currentThread();        setBlocker(t, blocker);        UNSAFE.park(false, 0L);        setBlocker(t, null);    }    private static void setBlocker(Thread t, Object arg) {        // Even though volatile, hotspot doesn't need a write barrier here.        UNSAFE.putObject(t, parkBlockerOffset, arg);    }

调用park(Object blocker)对传入的线程进行阻塞

    public static void park(Object blocker) {        Thread t = Thread.currentThread();        setBlocker(t, blocker);        UNSAFE.park(false, 0L);        setBlocker(t, null);    }

在截止时间之前阻塞传入的某个线程:

    public static void parkUntil(Object blocker, long deadline) {        Thread t = Thread.currentThread();        setBlocker(t, blocker);        UNSAFE.park(true, deadline);        setBlocker(t, null);    }

在nanos的时间范围内阻塞传入的线程:

    public static void parkNanos(Object blocker, long nanos) {        if (nanos > 0) {            Thread t = Thread.currentThread();            setBlocker(t, blocker);            UNSAFE.park(false, nanos);            setBlocker(t, null);        }    }

唤醒传入的线程:

    public static void unpark(Thread thread) {        if (thread != null)            UNSAFE.unpark(thread);    }

wait/notify方法和park/unpark方法区别

LockSupport类中的方法还有很多,在此先列举到这里。当我们看到阻塞和唤醒方法时,我们会联想到另一组唤醒方法wait()和notify(),这两组方法还是有所区别的。

这里直接记录下结论:wait和notify方法只能在同步代码块中使用(即必须与synchronized连用);必须先执行wait方法,然后再执行notify方法唤醒线程,调换顺序的话线程仍处于阻塞状态。

而park()和unpark()方法与之不同,这里可以通过代码运行结果来看:

package XIAOWEI;import java.util.concurrent.locks.LockSupport;public class Xiaowei{    public static void main(String[] args) {        Thread A = new Thread(()-> {            System.out.println("线程A已经被阻塞QWQ");            LockSupport.park();            System.out.println("线程A被线程B唤醒啦~~~");        });        A.start();        new Thread(()->{            System.out.println("线程B在唤醒线程A ing~~~");            LockSupport.unpark(A);        },"B").start();    }}

Java LockSupport常用方法有哪些

那如果我们先通过线程B唤醒线程A,然后再让线程A阻塞呢(让线程A的阻塞休眠两秒)?

package XIAOWEI;import java.util.concurrent.locks.LockSupport;public class Xiaowei {    public static void main(String[] args) {        Thread A = new Thread(()-> {            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("线程A已经被阻塞QWQ(第二版)");            LockSupport.park();            System.out.println("线程A被线程B唤醒啦~~~(第二版)");        });        A.start();        new Thread(()->{            System.out.println("线程B在唤醒线程A ing~~~驾驾驾");            LockSupport.unpark(A);        },"B").start();    }}

Java LockSupport常用方法有哪些

由上面输出结果来看,虽然线程B先唤醒了线程A,然后线程A再开始阻塞,但是线程A还是处于唤醒状态,这是为什么呢?

接下来我找了段LockSupport类中的注释,其实有时看看注释也挺有意思的哈哈:

 * <p>This class associates, with each thread that uses it, a permit
 * (in the sense of the {@link java.util.concurrent.Semaphore
 * Semaphore} class). A call to {@code park} will return immediately
 * if the permit is available, consuming it in the process; otherwise
 * it <em>may</em> block.  A call to {@code unpark} makes the permit
 * available, if it was not already available. (Unlike with Semaphores
 * though, permits do not accumulate. There is at most one.)

这段话大意是说,LockSupport类使用permits这个东西来实现线程的阻塞和唤醒。每一个线程都会使用到(拥有)permit,且permit的值默认为0。接着它又说,这个概念和Semaphore信号量差不多,但是permit的值只有0和1两个值。哦~原来是这样。

对于上面例子,线程B调用unpark方法唤醒A后,会使得线程A的permit值为1,当线程调用park方法使自己阻塞时,发现自己已经有许可(permit)了,就会继续向下执行业务,而不会阻塞不动。

感谢各位的阅读,以上就是“Java LockSupport常用方法有哪些”的内容了,经过本文的学习后,相信大家对Java LockSupport常用方法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java LockSupport常用方法有哪些

本文链接: https://lsjlt.com/news/349468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java LockSupport常用方法有哪些
    这篇文章主要讲解了“Java LockSupport常用方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java LockSupport常用方法有哪些”吧!Loc...
    99+
    2023-07-05
  • java中的常用方法有哪些
    1、trim()方法trim() 方法用于删除字符串的头尾空白符。实例:public class Test { public static void main(String args[]) { S...
    99+
    2020-11-11
    java基础 java 常用方法
  • 常用的java api方法有哪些
    Java API是Java提供的一组类库和接口,用于实现常见的编程任务。以下是常用的Java API方法:1. String类的方法...
    99+
    2023-06-14
    java api java api
  • java中常用的方法有哪些
    Java中常用的方法有以下几种:1. String类的方法:常用的字符串操作方法,如substring()、indexOf...
    99+
    2023-09-22
    java
  • Java-String的常用方法有哪些
    这篇文章主要介绍“Java-String的常用方法有哪些”,在日常操作中,相信很多人在Java-String的常用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java-String的常用方法有哪些...
    99+
    2023-06-05
  • java数组中常用方法有哪些
    1. arraycopy方法原型: public static void arraycopy(sourceArray,int index1,copyArray,index2,int length)即从sourceArray的index1位置...
    99+
    2019-02-11
    java 数组 常用方法
  • java中stringbuffer的常用方法有哪些
    append(String str): 将指定字符串添加到StringBuffer的末尾。2. insert(int offset,...
    99+
    2023-10-18
    java
  • java math函数常用方法有哪些
    Java Math类中常用的方法有:1. abs(x):返回x的绝对值。2. ceil(x):返回大于或等于x的最小整数。3. fl...
    99+
    2023-08-14
    java math
  • java中optional的常用方法有哪些
    这篇文章主要介绍了java中optional的常用方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中optional的常用方法有哪些文章都会有所收获,下面我们一起来看看吧。前言Java中的Opt...
    99+
    2023-07-05
  • java集合Collection常用方法有哪些
    这篇文章主要介绍了java集合Collection常用方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java集合Collection常用方法有哪些文章都会有所收获,下面我们一起来看看吧。为什么要有集合...
    99+
    2023-07-05
  • Java基础中List常用方法有哪些
    这篇文章主要介绍“Java基础中List常用方法有哪些”,在日常操作中,相信很多人在Java基础中List常用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java...
    99+
    2024-04-02
  • 详解Java String类常用方法有哪些
    一、构造器 实质是给底层的char数组value赋值 String s1 = new String(); String s2 = new String(“abc”); Strin...
    99+
    2024-04-02
  • java中Files的常用方法都有哪些
    java中Files的常用方法:Files.exists():检测文件路径是否存在。Files.createFile():创建文件。Files.createDirectory():创建文件夹。Files.delete():删除一个文件或目录...
    99+
    2024-04-02
  • Java中Object类常用的方法有哪些
    本篇内容主要讲解“Java中Object类常用的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中Object类常用的方法有哪些”吧!前言Java 中的 Object 方法在面试...
    99+
    2023-06-22
  • Java的Collection集合常用方法有哪些
    这篇文章主要介绍了Java的Collection集合常用方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java的Collection集合常用方法有哪些文章都会有所收获,下面我们一起来看看吧。1、boo...
    99+
    2023-06-29
  • java中object类的常用方法有哪些
    Java中Object类的常用方法有: equals(Object obj):判断两个对象是否相等。 hashCode():返回对...
    99+
    2023-10-25
    java object
  • Java中request对象常用方法有哪些
    在Java中,HttpServletRequest对象是处理HTTP请求的对象,常用的方法有:1. getParameter(Str...
    99+
    2023-08-18
    Java request
  • Java多线程常用的方法有哪些
    本文小编为大家详细介绍“Java多线程常用的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java多线程常用的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、线程相关概念程序:是为完成特定...
    99+
    2023-07-04
  • Java BeanUtils工具类常用方法有哪些
    Java BeanUtils工具类常用方法有:1. copyProperties(Object dest, Object orig)...
    99+
    2023-08-15
    Java BeanUtils
  • Java中StringBuilder()常见方法有哪些
    在Java中,StringBuilder类提供了多个常见的方法用于字符串的操作,以下是一些常用的方法:1. append(Strin...
    99+
    2023-09-13
    Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作