JAVA并发编程学习笔记09-LockSupport

基本使用

关键方法

  • park():使当前线程暂停,类似wait()方法
  • unpark(Thread thread):唤醒指定线程,类似notify()方法

1.先调用park()再调用unpark()方法

@Slf4j
public class Test {

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            log.info("park start");
            LockSupport.park();
            log.info("park end");
        });
        t1.start();

        Thread.sleep(1000);
        log.info("unpark");
        LockSupport.unpark(t1);
    }
}

在这里插入图片描述
返回结果可以看到,在调用了park方法后,线程t1处于暂停状态,当主线程调用unpark方法唤醒t1后,t1苏醒。

2.先调用unpark()再调用park()方法

@Slf4j
public class Test {

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("park start");
            LockSupport.park();
            log.info("park end");
        });
        t1.start();

        Thread.sleep(1000);
        log.info("unpark");
        LockSupport.unpark(t1);
    }
}

在这里插入图片描述
返回结果可以看出,先调用unpark后,t1线程调用park后并未进入休眠

原理

JAVA每个线程底层都有对应的Parker对象,其中有一个关键的属性counter,当调用park()时,是判断counter是否为1,若为1,则直接放行,然后将counter设为0,若为0,则休眠。调用unpark则是将counter设为1,故当先调用unpark方法再调用park不会进入休眠。

区别wait()和notify()

  1. wait()、notify()基于Monitor,需要synchnorized支持,而park()、unpark()基于Parker对象,不需要加锁。
  2. wait()方法必须在notify()方法之前才能被唤醒,而park()方法可以先unpark().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值