Java

LockSupport用法

2019-08-17  本文已影响2人  endlesswork

一、示例

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
开始执行解锁
上一篇 下一篇

猜你喜欢

热点阅读