Java concurrency之LockSupport
什么是LockSupport
LockSupport是Java并发包中的一个类,用于创建锁和其他同步类的基本构建块,它与已有的同步类不同,其可以阻塞和唤醒线程。LockSupport提供了非常灵活的线程阻塞和唤醒操作,其不会遇到像Object.wait和Thread.join方法那样的一些限制,如同程度、顺序性等,从而使LockSupport更具灵活性。LockSupport提供了park和unpark两个方法分别用于阻塞和唤醒线程。
park方法
park方法用于阻塞当前线程,方法有多种实现方式,但无论如何,调用park方法都会让线程进入一种阻塞状态。LockSupport提供了三个版本的park方法,分别是:
public static void park();
public static void park(Object blocker);
public static void parkNanos(long nanos);
public static void parkNanos(Object blocker, long nanos);
public static void parkUntil(long deadline);
public static void parkUntil(Object blocker, long deadline);
- 第一个版本的park方法将让当前线程一直阻塞,直到有其他线程通过unpark方法唤醒该线程。
- 第二个版本的park方法会将Object对象作为阻塞的参数,调用该方法会使当前线程阻塞,并将Object对象与当前线程关联起来,其它线程无法访问该Object对象。
- 第三个版本的park方法将会阻塞当前线程一定的时间。
- 第四个版本的park方法则接收两个参数,第一个参数阻塞的同步对象,第二个参数阻塞的时间。
public class LockSupportTest{
public static void main(String[] args) throws Exception{
Thread thread = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " park ...");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + " unpark ...");
},"Thread-A");
thread.start();
TimeUnit.SECONDS.sleep(2L);
LockSupport.unpark(thread);
}
}
- 程序输出:
Thread-A park ...
Thread-A unpark ...
unpark方法
unpark方法用于唤醒指定线程,调用unpark方法可以使得其它线程中因调用park方法而被阻塞的线程恢复运行。可以调用多次unpark方法唤醒同一个被阻塞的线程,也可以在调用park方法之前调用unpark方法,这种情况下,线程调用park方法时,不会阻塞,即park方法不起作用。
public class LockSupportTest {
public static void main(String[] args) throws Exception{
Thread thread = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + ": park1");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ": park2");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ": unpark1");
LockSupport.unpark(Thread.currentThread());
System.out.println(Thread.currentThread().getName() + ": park3");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + ": unpark2");
}, "Thread-A");
thread.start();
TimeUnit.SECONDS.sleep(2L);
System.out.println(Thread.currentThread().getName() + ": unpark1");
LockSupport.unpark(thread);
TimeUnit.SECONDS.sleep(2L);
System.out.println(Thread.currentThread().getName() + ": unpark2");
LockSupport.unpark(thread);
}
}
- 程序输出:
Thread-A: park1
main: unpark1
Thread-A: park2
Thread-A: unpark1
Thread-A: park3
main: unpark2
总结
- LockSupport提供的park和unpark方法可以实现线程的阻塞和唤醒操作;
- LockSupport相比于Object.wait和Thread.join,更加灵活、可靠;
- unpark方法可以先于park方法调用,不影响后续线程的阻塞;
- 可以通过指定同步对象,让阻塞的线程与同步对象关联,从而实现更加复杂的同步逻辑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java concurrency之LockSupport_动力节点Java学院整理 - Python技术站