java locksupport_Java-LockSupport

LockSupport 和 CAS 是 Java 并发包中很多并发工具控制机制的基础,它们底层其实都是依赖 Unsafe 实现。

LockSupport 提供 park() 和 unpark() 方法实现阻塞线程和解除线程阻塞。

每个使用 LockSupport 的线程都会与一个许可(permit)关联,如果该许可可用,则调用 park() 将会立即返回。如果许可尚不可用,则可以调用 unpark() 使其可用,否则可能阻塞。

permit 最多只有一个,重复调用 unpark() 也不会累加。unpark() 可以先于 park() 调用。

一、API

阻塞

void park():阻塞当前线程,如果调用 unpark() 方法或者当前线程被中断,从能从 park() 方法中返回

void park(Object blocker):功能同方法上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便 dump 线程时进行问题排查

void parkNanos(long nanos):阻塞当前线程,最长不超过 nanos 纳秒,增加了超时返回的特性

void parkNanos(Object blocker, long nanos):功能同方法上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便 dump 线程时进行问题排查

void parkUntil(long deadline):阻塞当前线程,直到 deadline

void parkUntil(Object blocker, long deadline):功能同方法上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便 dump 线程时进行问题排查

唤醒

void unpark(Thread thread):唤醒处于阻塞状态的指定线程

二、使用

1.先 park 再 unpark

Thread t = new Thread(() ->{

System.out.println("睡觉");

LockSupport.park();

System.out.println("起床");

});

t.start();

Thread.sleep(1000);

System.out.println("妈妈喊我起床");

LockSupport.unpark(t);

383c39dc3646b1c4acb152f7b0323c54.png

2.先 interrupt 再 park

Thread t = new Thread(() ->{

System.out.println("睡觉");

LockSupport.park();

System.out.println("起床");

System.out.println("是否中断:" +Thread.currentThread().isInterrupted());

});

t.start();

t.interrupt();

System.out.println("突然肚子很疼");

8526fa041da0427d61e860814901dc9f.png

可以看到中断后执行 park() 会直接执行下面的方法,并不会抛出 InterruptedException

3.先 unpark 再 park

Thread t = new Thread(() ->{try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("睡觉");

LockSupport.park();

System.out.println("7点到,起床");

});

t.start();

LockSupport.unpark(t);

System.out.println("提前上好闹钟7点起床");

e6093a887f1ecef94063fdc6dec0a710.png

先设置好许可(unpark)再获取许可的时候不会进行等待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值