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 是一个强大而灵活的工具,可以在多线程编程中实现精确的线程控制和通信。