美文网首页Java
LockSupport用法

LockSupport用法

作者: endlesswork | 来源:发表于2019-08-17 16:07 被阅读2次

一、示例

1.park用法

LockSupport的用法

public class LockSupportDemo implements Runnable{

    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LockSupportDemo(String name){
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + "开始执行");
        LockSupport.park();
        System.out.println(name + "正常执行");
        System.out.println(name + "阻塞状态" + Thread.interrupted());
    }

    public static void main(String args[]) throws InterruptedException {
        LockSupportDemo lockSupportDemo = new LockSupportDemo("t1");
        Thread thread1 = new Thread(lockSupportDemo);
        thread1.start();

        LockSupportDemo lockSupportDemo2 = new LockSupportDemo("t2");
        Thread thread2 = new Thread(lockSupportDemo2);
        thread2.start();

        Thread.sleep(1000);
        System.out.println("开始执行解锁");
        LockSupport.unpark(thread2);
        System.out.println("线程1的运行状态为"+thread1.getState());

    }
}

结果如下

t1开始执行
t2开始执行
开始执行解锁
t2正常执行
t2阻塞状态false
线程1的运行状态为WAITING

2.对于park带参方法

这里我们看下park带参方法使用

public class LockSupportDemo1{

    public static Test test = new Test("test1");

    public static class ThreadDemo implements Runnable{

        public ThreadDemo(String name){
            this.name = name;
        }

        public String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            Date date = new Date();
            SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
            System.out.println(name + "开始执行" + dateFormat.format(date));
            LockSupport.park(test);
            Date date1 = new Date();
            System.out.println(name + "正常执行" + dateFormat.format(date1));
            System.out.println(name + "阻塞状态" + Thread.interrupted());
        }
    }

    public static class ThreadDemo2 implements Runnable{

        public ThreadDemo2(String name){
            this.name = name;
        }

        public String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            synchronized (test){
                Date date = new Date();
                SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
                System.out.println("------------获取synchronized锁成功"+test.getTag()+ dateFormat.format(date));
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Date date1 = new Date();
                System.out.println("------------获取synchronized锁结束"+test.getTag()+ dateFormat.format(date1));
            }
        }
    }

    public static class Test{

        public Test(String tag){
            this.tag =tag;
        }

        public String tag;

        public String getTag() {
            return tag;
        }

        public void setTag(String tag) {
            this.tag = tag;
        }
    }

    public static void main(String args[]) throws InterruptedException {
        ThreadDemo threadDemo = new ThreadDemo("t1");
        Thread thread1 = new Thread(threadDemo);
        thread1.start();
        Thread.sleep(1000);
        ThreadDemo2 threadDemo2 = new ThreadDemo2("t2");
        Thread thread2 = new Thread(threadDemo2);
        thread2.start();
        Thread.sleep(1000);
        LockSupport.unpark(thread1);
    }
}

结果如下,可以看到线程t1并没有等待t2持有test的对象锁

t1开始执行2019-04-20 :03:28:53
------------获取synchronized锁成功test12019-04-20 :03:28:54
***********2019-04-20 :03:28:55
t1正常执行2019-04-20 :03:28:55
t1阻塞状态false
------------获取synchronized锁结束test12019-04-20 :03:28:59

3、unpark顺序分析

public class LockSupportDemo2 implements Runnable{

    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LockSupportDemo2(String name){
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + "开始执行");
        LockSupport.unpark(Thread.currentThread());
        LockSupport.park();
        System.out.println(name + "正常执行");
        System.out.println(name + "阻塞状态" + Thread.interrupted());
    }

    public static void main(String args[]) throws InterruptedException {
        LockSupportDemo2 lockSupportDemo = new LockSupportDemo2("t1");
        Thread thread1 = new Thread(lockSupportDemo);
        thread1.start();
        Thread.sleep(1000);
        System.out.println("开始执行解锁");
        LockSupport.unpark(thread1);

    }
}

可以看到结果,unpark会让下次park不起作用

t1开始执行
t1正常执行
t1阻塞状态false
开始执行解锁

相关文章

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

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

  • LockSupport

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

  • LockSupport用法

    一、示例 1.park用法 LockSupport的用法 结果如下 2.对于park带参方法 这里我们看下park...

  • LockSupport的用法及原理

    是什么 LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后...

  • LockSupport的用法及原理

    出自:https://www.jianshu.com/p/f1f2cd289205 可以阻塞当前线程,并在其他线程...

  • 并发编程-(3)-LockSupport

    目录: 1、LockSupport工具定位: 2、LockSupport工具定义: 3、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用法

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