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继续执行