美文网首页
LockSupport

LockSupport

作者: kakukeme | 来源:发表于2021-03-12 08:53 被阅读0次

LockSupport简介

LockSupport用来实现线程的挂起和唤醒,它是Java6引入的一个工具类,它简单灵活,应用广泛,同时也是构建同步组件的基础工具。

LockSupport API

// 阻塞当前线程,调用unpark(Thread thread)方法或者当前线程被中断,才能从park返回
void park()
// 阻塞当前线程但时间不超过nanos纳秒
void parkNanos(long nanos)
// 阻塞当前线程直到deadline时间(从1970开始到deadline时间毫秒数)
void parkUntil(long deadline)
// 唤醒处于阻塞状态的线程
void unpark(Thread thread)

// java6增加了以下3个方法
void park(Object blocker)

void parkNanos(Object blocker,long nanos)

void parkUntil(Object blocker,long deadline)

用于实现阻塞当前线程的功能,blocker用于标识当前线程正在等待的对象(阻塞对象),该对象主要用于给开发人员提供阻塞对象的信息,有助于问题排查和系统监控。

Object等待唤醒wait/notify/notifyAll

// object wait notify
public static void main(String[] args) throws InterruptedException {
        final Object obj = new Object();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    synchronized (obj){
                        obj.wait();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("go here");
            }
        });
        thread.start();
        Thread.sleep(1000);
        synchronized (obj){
            obj.notify();
        }
    }

// 上述睡眠一秒钟,保证线程thread阻塞在wait方法,若此处注释,主线程先notify,
// 可能程序一直处于wait等待状态,所以必须先阻塞后notify。
// 可见Object的wait与notify的调用是有先后顺序的。

LockSupport阻塞唤醒park/unpark

public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    LockSupport.park();
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("go here");
            }
        });
        thread.start();
        LockSupport.unpark(thread);
    }

// LockSupport支持主线程先调用unpark后,线程thread再调用park而不被阻塞。

总结一下,LockSupport与Object(wait/notify)不同点:

  • ①LockSupport不需要在同步代码块里 ,所以线程间也不需要维护一个共享的同步对象,实现了线程间的解耦。

  • ②unpark函数可以先于park调用,所以不需要担心线程间的执行的先后顺序。

  • ③多次调用unpark方法和调用一次unpark方法效果一样,比如线程A连续调用两次LockSupport.unpark(B)方法唤醒线程B,然后线程B调用两次LockSupport.park()方法, 线程B依旧会被阻塞。因为两次unpark调用效果跟一次调用一样,只能让线程B的第一次调用park方法不被阻塞,第二次调用依旧会阻塞。

原文链接:https://blog.csdn.net/jiangtianjiao/article/details/86693898

相关文章

  • 并发编程-(3)-LockSupport

    目录: 1、LockSupport工具定位: 2、LockSupport工具定义: 3、LockSupport常用...

  • 并发编程系列之掌握LockSupport的用法

    并发编程系列之掌握LockSupport的用法 1、什么是LockSupport? LockSupport是用于创...

  • Java CAS

    CAS和LockSupport可以说贯穿了java并发包(自旋锁 + CAS + LockSupport + 内存...

  • 5.LockSupport核心原理分析

    LockSupport核心原理分析 在前面分析AQS的时候,经常出现LockSupport.park(this);...

  • Java并发系列 — LockSupport

    本文由【JDK1.8】JUC——LockSupport和【细谈Java并发】谈谈LockSupport这两篇文章整...

  • LockSupport

    总结一下,LockSupport比Object的wait/notify有两大优势: ①LockSupport不需要...

  • LockSupport

    示例用法: LockSupport.park() 对应一个LockSupport.unpark(),类似于一个计...

  • java并发编程之LockSupport

    LockSupport,构建同步组件的基础工具,帮AQS完成相应线程的阻塞或者唤醒的工作。 LockSupport...

  • LockSupport

    LockSupport的park和unpark的基本使用,以及对线程中断的响应性ps: LockSupport.p...

  • 并发:LockSupport

    LockSupport LockSupport看名字叫锁支持,这个玩意的功能跟wait和notify很像,它也是可...

网友评论

      本文标题:LockSupport

      本文链接:https://www.haomeiwen.com/subject/vymoqltx.html