LockSupport

1.介绍

java.util.concurrent.locks.LockSupport

Basic thread blocking primitives for creating locks and other synchronization classes.

和wait/notify相似,LockSupport主要作用是唤醒和阻塞线程,jdk源码中很常用(java.util.concurrent.locks包)。

park():阻塞线程,原理是将_counter值置为0,判断前值是否为1(先unpark),若是直接放行,否则阻塞。

unpark(Thread):唤醒线程,原理是将_counter值置为1,判断前值是否为0(park过),若是则唤醒线程,否则直接退出

更多的api自行查阅jdk源码

 

2.LockSupport与wait/notify区别

(1)wait/notify是object方法,只能先获得锁对象再调用,也就是说只能在同步代码块中使用,而LockSupport没有这个限制。

(2)当阻塞等待队列中有多个线程时,notify只能随机唤醒一个,unpark(Thread)可以唤醒指定线程。

(3)LockSupport可以先unpark再park,线程也能顺利执行。但是unpark不可累计,也就是前面说的_counter值最多为1。

 

3.LockSupport与interrupt()

interrupt()会设置线程的中断标志位

LockSupport.park()会检查线程是否设置了中断标志位,如果设置了,则返回(这里并不会清除中断标志位)

也就是说interrupt()会唤醒park()的线程,但是不会抛异常,也不会清除中断标志位

示例:

 1 public class LockSupportDemo {
 2 
 3     static MyThread t1 = new MyThread("t1");
 4     static MyThread t2 = new MyThread("t2");
 5 
 6     public static class MyThread extends Thread {
 7         public MyThread(String name) {
 8             super(name);
 9         }
10 
11         @Override
12         public void run() {
13             System.out.println("start " + getName());
14             LockSupport.park();
15             if (Thread.currentThread().isInterrupted()) {
16                 System.out.println(getName() + "被中断了");
17             }
18             System.out.println(getName() + "继续执行");
19         }
20     }
21 
22     public static void main(String[] args) throws InterruptedException {
23         t1.start();
24         Thread.sleep(1000L);
25         t2.start();
26         Thread.sleep(3000L);
27         t1.interrupt();
28         LockSupport.unpark(t2);
29     }
30 }

输出:

start t1
start t2
t1被中断了
t1继续执行
t2继续执行

 

posted @ 2021-03-12 15:04  OUYM  阅读(104)  评论(0编辑  收藏  举报