LockSupport功能
- LockSupport在JDK中主要提供了线程的阻塞和唤醒功能。提供了更高级别的同步功能。
- 阻塞方法主要是以park开头的各种方法,唤醒线程的方法只有unpark一个方法。
- LockSupport中的 park和unpark方法提供的线程阻塞和唤醒功能,避免了Object中已经废弃方法suspend和resume引起的死锁问题。
阻塞方法
- park方法的执行与获得的执行许可有关系。如果获得许可,则调用park方法立即返回;如果没有获得许可,则调用park方法一直阻塞。默认情况下,调用park方法是没有获得许可的,即调用该方法要阻塞。
- park方法阻塞时,发生如下情况下可以就可解除阻塞
2.1 其他线程调用该线程的unpark方法
2.2 其他线程调用该线程的interrput方法,即park方法能够响应中断。 - LockSupport类中的park方法
// 阻塞当前线程
public static void park()
// 在规定的纳秒时间内阻塞状态
public static void parkNanos(long nanos)
// 在规定的毫秒时间内阻塞
public static void parkUntil(long deadline)
// 在规定的时间内阻塞与当前线程相关联的对象
public static void parkUntil(Object blocker, long deadline)
// 阻塞与当前线程相关联的对象
public static void park(Object blocker)
park
- 默认情况下,park方法获取不到执行许可,执行该方法会一直阻塞
public class LockSupportService {
public static void main(String[] args) {
// TODO Auto-generated method stub
//LockSupport.unpark(Thread.currentThread());
// 默认是被占用的,会一直阻塞下去
LockSupport.park();;
System.out.println("aaaa");
}
}
1.1. 如果上述程序中先调用LockSupport中的unpark方法,则park方法获取到了许可,则不会阻塞。会立即返回。程序打印出aaaa。
unpark
- unpark(Thread thread)方法为唤醒当前执行阻塞的线程。其方法参数就是指需要唤醒的线程对象。
- 结合park方法,了解一下LockSupport工具的使用。
public class LockSupportService {
public static void main(String[] args) {
// 释放许可
LockSupport.unpark(Thread.currentThread());
// 默认是被占用的
LockSupport.park();;
System.out.println("aaaa");
Thread ta = new Thread(new ServiceA());
Thread tb = new Thread(new ServiceB(ta));
ta.start();
tb.start();
}
}
// 线程A
class ServiceA implements Runnable{
public void run() {
LockSupport.park();
System.out.println("I am service A ");
}
}
// 线程B
class ServiceB implements Runnable{
private Thread thread;
public ServiceB(Thread thread) {
super();
this.thread = thread;
}
public void run() {
try {
Thread.sleep(20*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//thread.interrupt();
// 唤醒当前阻塞的线程
LockSupport.unpark(thread);;
System.out.println("I am service B ");
}
}
- 上述程序线程A调用park方法,默认情况下是没有获得许可,一直处于阻塞状态。线程B睡眠20秒后,唤醒线程A。最终程序执行结果如下图所示:
- 将线程B中的LockSupport中的unpark方法换成Thread.interrupt方法后,执行效果一样,则证明了LockSupport中的park方法能够响应线程的中断。interrupt中断当前线程的执行状态。
总结
- LockSupport工具类在JDK中的并发处理中底层使用挺多的,多用心去理解和多看源码有助于更深刻的了解。