备忘录四
前言 简单记录一下车载开发中修改的部分记录,记录于此,方便自...
不会释放锁
synchronized (lock) { Thread.sleep(1000); // 抱着锁睡觉 }
只让当前线程暂停执行,其他线程无法获取到锁。
时间到
被interrupt(中断)
会释放锁
synchronized (lock) { lock.wait(); // 释放锁,等待被唤醒 }
当前线程释放锁,其他线程可以竞争锁
wait()必须放在 synchronized中,否则会抛IllegalMonitorStateException
synchronized可以保证可见性、原子性、有序性
notify()不会立刻释放锁
真正释放是在synchronized块结束
| 场景 | 用谁 |
|---|---|
| 单纯让线程暂停 | Thread.sleep() |
| 线程间协作 | wait()/ notify() |
| 生产者-消费者 | wait()/ notifyAll() |
| 定时任务 | sleep() |
sleep() 不释放锁,只是让线程“睡一会”;
wait() 会释放锁,并且必须在 synchronized 中使用。
| 对比点 | wait() | sleep() |
|---|---|---|
| 所属类 | Object | Thread |
| 是否释放锁 | ✅ 释放锁 | ❌ 不释放锁 |
| 使用位置 | 必须在 synchronized中 | 任意地方 |
| 唤醒方式 | notify()/ notifyAll()/ 超时 | 超时 / 中断 |
| 是否需要捕获异常 | ✅ InterruptedException | ✅ InterruptedException |
| 是否依赖锁对象 | ✅ 是 | ❌ 否 |
| 设计目的 | 线程协作 | 暂停执行 |