本章我们介绍两个Java 并发包中用于线程协作的工具--LockSupport和Condition
LockSupport:
Java 并发包(java.util.concurrent.locks)
提供了基于许可(permit)的线程阻塞和唤醒机制--LockSupport
对于LockSupport是通过方法park以及unpark来对线程进行阻塞和唤醒的
public static void park() {
UNSAFE.park(false, 0L);
}
public static void unpark(Thread var0) {
if (var0 != null) {
UNSAFE.unpark(var0);
}
}
我们可以看出park方法很简单只是调用了Unsafe
的方法park。Unsafe
正如它名字而言是 Java 中一个 高度危险且未被官方正式支持 的类,位于 sun.misc
包下(JDK 9 后移至 jdk.internal.misc
包)。它提供了一系列 直接操作底层资源 的方法,允许开发者绕过 Java 语言的安全机制,直接访问内存、操作线程状态等。所以LockSupport就是基于unsafe类进行包装后的类,将原来的不安全类封装成了一个安全类供开发者使用。对于park方法的两个参数一个是Boolean类型一个是long类型,分别用来表示是否为绝对时间以及阻塞的时长,对于0L则是永久阻塞。
对于unpark方法来说则是多了一个参数Thread,这个参数的作用是用来指定唤醒的线程。为什么park不需要参数而unpark需要参数呢,因为unpark唤醒的都是其他线程,当本线程进入阻塞后则无法自己唤醒自己只能通过其他线程来唤醒自己。
Condition:
Condition
是 Java 并发包(java.util.concurrent.locks
)中的一个接口,用于替代传统的 Object.wait()
、Object.notify()
和 Object.notifyAll()
,提供更灵活、更强大的线程间协作机制。它通常与 Lock
接口配合使用,实现精细化的线程等待和唤醒操作。
也就是说Condition的定位其实与Object.wait类似,都是协助锁来实现线程的协作机制。
特性 |
---|