AQS基础 LockSupport


前言

LockSupport类提供了较低级别的阻塞和解除阻止支持,这对于那些实现自己的自定义锁类的开发人员非常有用。

一、LockSupport是什么?

LockSupport 用于创建锁和其他同步类的基本线程阻塞原语。。

二、使用步骤

1.简单介绍

LockSupport通过许可(permit)实现线程挂起、挂起线程唤醒功能。permit可以理解为每个已启动线程维持的一个int类型状态位counter。线程分别通过执行LockSupport静态方法park()、unPark()方法来完成挂起、唤醒操作。

Locksupport 是 线程等待唤醒机制(wait/notify)的改良加强版

2.简单使用

public static void LockSupportHello(){
        /**
         *  不需要在 同步代码块中 同时也不需要 先等待再唤醒
         */
        Thread a = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-----开始了");
            LockSupport.park();
            System.out.println(Thread.currentThread().getName()+"-----唤醒了");
        });
        a.start();

        Thread b = new Thread(() -> {
            LockSupport.unpark(a);
            System.out.println(Thread.currentThread().getName()+"-----继续回来了");
        });
        b.start();
    }

得到的结果就是 线程正常执行

Thread-1-----继续回来了
Thread-0-----开始了
Thread-0-----唤醒了

3.Locksupport 之前使用Syschronized 以及ReentrantLock

Syschronized 使用

public static void synchronizedHello(){
        /**
         * 必须 放在同步代码块中,并且必须先等待再唤醒
         */
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o){
                System.out.println(Thread.currentThread().getName()+"-----开始了");
                try {
                    o.wait();
                    System.out.println(Thread.currentThread().getName()+"-----继续回来了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"a").start();
        new Thread(()->{
            synchronized (o){
                o.notify();
                System.out.println(Thread.currentThread().getName()+"-----唤醒了");
            }
        },"b").start();
    }

结果:去掉synchronized 同步代码块之后报出异常 java.lang.IllegalMonitorStateException

Exception in thread "a" Exception in thread "b" java.lang.IllegalMonitorStateException
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:502)
	at AQS.support.LockSopportOldNew.lambda$synchronizedHello$0(LockSopportOldNew.java:23)
	at java.lang.Thread.run(Thread.java:748)
java.lang.IllegalMonitorStateException
	at java.lang.Object.notify(Native Method)
	at AQS.support.LockSopportOldNew.lambda$synchronizedHello$1(LockSopportOldNew.java:32)
	at java.lang.Thread.run(Thread.java:748)

先等待再唤醒结果是:

b-----唤醒了
a-----开始了

线程阻塞

ReentrantLock使用

public static void LockHello(){
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+"-----开始了");
                condition.await();
                System.out.println(Thread.currentThread().getName()+"-----唤醒了");
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        },"a").start();
        new Thread(()->{
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+"-----继续回来了");
                condition.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        },"b").start();
    }

这里就不给大家一一展示了,感兴趣的小伙伴可以自己去看一下结果。

总结

提示:本篇文章主要讲解了LockSupport的基本使用,以及在LockSupport出来之前 Syschronized 以及ReentrantLock 的使用和缺点。小编会持续更新,谢谢大家的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值