
LockSupport定义
LockSupport 是 Java 并发包中的一个类,用于线程的阻塞和唤醒操作。
LockSupport优点
LockSupport特点主要体现在如下几点:
- 灵活性:与 Object 类的 wait() 和 notify() 方法相比,LockSupport 提供了更灵活的线程阻塞和唤醒机制,可以在任意位置对线程进行阻塞和唤醒,而不需要依赖特定的对象锁。
- 无需持有锁: 与
wait()和notify()方法不同,LockSupport不需要线程持有特定对象的锁,这减少了因为锁竞争引起的性能问题和死锁风险。 - 可唤醒性: 使用
LockSupport的unpark()方法可以在阻塞之前或之后进行调用,这意味着可以提前唤醒线程,避免不必要的阻塞。这种特性对于实现复杂同步模式非常有用。 - 线程级别控制:
LockSupport提供的是线程级别的控制,不需要等待对象级别的锁释放。这有助于减少死锁风险,因为线程不会因为等待对象锁而被阻塞。
LockSupport用法
LockSupport 主要提供了两个静态方法来实现线程的阻塞和唤醒:
park方法
LockSupport 类中的 park() 方法用于阻塞当前线程,让其进入等待状态。
如下所示:
import java.util.concurrent.locks.LockSupport;
public class LockSupportParkExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("Thread is going to park");
LockSupport.park(); // 阻塞线程
System.out.println("Thread is unparked");
});
thread.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
LockSupport.unpark(thread); // 唤醒线程
}
}
在上述示例中,新线程调用 LockSupport.park() 方法后被阻塞,2秒后主线程调用 LockSupport.unpark(thread) 方法来唤醒该线程。
unpark
LockSupport 类中的 unpark(Thread thread) 方法用于唤醒指定的线程,将其从阻塞状态转换为可运行状态。
如下所示:
import java.util.concurrent.locks.LockSupport;
public class LockSupportExample {
public static void main(String[] args) {
Thread mainThread = Thread.currentThread();
// 创建一个新线程
Thread otherThread = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
LockSupport.unpark(mainThread); // 唤醒主线程
});
otherThread.start();
System.out.println("Main thread is waiting...");
LockSupport.park(); // 阻塞主线程
System.out.println("Main thread is resumed");
}
}
在上述示例中,主线程启动了一个新线程 otherThread,然后调用 LockSupport.park() 阻塞自己。
新线程在睡眠2秒后调用 LockSupport.unpark(mainThread) 来唤醒主线程。
需要注意的是,unpark() 方法不会立即导致线程执行,而是解除线程的阻塞状态,让线程有机会继续执行。
LockSupport总结
LockSupport 提供了灵活的线程阻塞和唤醒机制,可以在任意位置对线程进行阻塞和唤醒,不需要依赖特定的对象锁。
与传统的等待/通知机制不同,LockSupport 不需要线程持有特定对象的锁,减少了因为锁竞争引起的性能问题和死锁风险。
LockSupport 是一个强大而灵活的工具,可以在多线程编程中实现精确的线程控制和通信。
mikechen睿哥
10年+一线大厂架构实战专家,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。