wait¬ify和park&unpark的区别?
1 个回答
活在别人的言论下,是对自己的不尊重。柳青莲### 主要区别 #### 1. **是否依赖 Monitor(锁)** - **`wait`/`notify`/`notifyAll`**: - 必须配合 `synchronized` 或者对象的 Monitor 一起使用。 - 线程在调用 `wait` 方法前需要先获取目标对象的锁。 - 调用 `notify` 或 `notifyAll` 时,当前线程也需要持有目标对象的锁。 - **`park`/`unpark`**: - 不依赖 `synchronized` 或者对象的 Monitor。 - 由 `LockSupport` 提供的静态方法直接操作线程,独立于任何锁机制。 #### 2. **线程唤醒的精确性** - **`wait`/`notify`**: - `notify` 是随机唤醒一个正在等待该对象锁的线程,不能精准控制哪个线程被唤醒。 - `notifyAll` 会唤醒所有等待线程。 - **`park`/`unpark`**: - 是以线程为单位的。`unpark(Thread t)` 可以精准唤醒指定的线程。 #### 3. **调用顺序** - **`wait`/`notify`**: - 需要先调用 `wait` 后才能调用 `notify`。 - 如果先调用 `notify`,此时没有线程在等待,那么这个通知会被丢失。 - **`park`/`unpark`**: - `unpark` 可以先于 `park` 调用。 - 如果先调用了 `unpark`,那么线程在后续调用 `park` 时不会被阻塞。 #### 4. **实现原理** - **`wait`/`notify`**: - 基于 `Object` 的 Monitor,底层依赖操作系统的 Monitor 机制。 - **`park`/`unpark`**: - 基于 `Unsafe` 类的底层操作,直接使用线程的阻塞队列和许可管理。 #### 5. **性能** - **`park`/`unpark`**: - 在一些场景下性能优于 `wait`/`notify`,特别是在精确控制线程阻塞和唤醒时。 - **`wait`/`notify`**: - 通常需要搭配额外逻辑,可能会导致线程被错误唤醒或者出现竞争问题。 #### 示例对比 **`wait`/`notify` 示例**: ```java class WaitNotifyExample { private static final Object lock = new Object(); public static void main(String[] args) { Thread t1 = new Thread(() -> { synchronized (lock) { try { System.out.println("Thread waiting..."); lock.wait(); System.out.println("Thread resumed!"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread t2 = new Thread(() -> { synchronized (lock) { System.out.println("Thread notifying..."); lock.notify(); } }); t1.start(); t2.start(); } } ``` **`park`/`unpark` 示例**: ```java import java.util.concurrent.locks.LockSupport; class ParkUnparkExample { public static void main(String[] args) { Thread t1 = new Thread(() -> { System.out.println("Thread parking..."); LockSupport.park(); System.out.println("Thread resumed!"); }); Thread t2 = new Thread(() -> { System.out.println("Thread unparking..."); LockSupport.unpark(t1); }); t1.start(); t2.start(); } } ``` ### 总结 - 如果需要依赖锁机制,可以使用 `wait`/`notify`。 - 如果需要更灵活且线程控制粒度更精确,推荐使用 `park`/`unpark`。发布于 2025-01-25 07:58 •IP属地 陕西举报评论收藏
公众号进入网站体验更佳

