Java线程中等待和阻塞的区别
等待是主动放弃CPU的执行权,进入等待队列,等待特定条件被满足后才能被唤醒(通常由其他线程调用notify()或notifyAll())
进入方式:
调用Object.wait()方法。
进入Thread.join()。
LockSupport.park().
线程状态:
WAITING或TIMED_WAITING
唤醒方式:
被其他线程通过 notify() / notifyAll() 唤醒。
到达 wait(timeout) 的超时时间。
阻塞是线程尝试获取某个资源(如锁)失败,被操作系统强制挂起,等待资源释放,一旦资源释放,线程就会进入就绪状态。
缺点:线程阻塞会导致 CPU 在用户态(User Mode)和内核态(Kernel Mode)之间发生切换,称之为上下文切换。
进入方式:
访问被synchronized锁定的代码块或方法,但锁已被其他线程持有。
ReentrantLock.lock()阻塞等锁。
I/O阻塞,(如read()时无数据)。
线程状态:BLOCKED或WAITING(对锁等待时)
唤醒方式:当锁或资源可用时,线程自动从阻塞状态进入就绪队列。
特点:
是系统层级的资源竞争造成的被动等待。
不释放锁。
对比图
| 特性 | 等待(Waiting) | 阻塞(Blocking) |
|---|---|---|
| 是否主动行为 | 主动(调用 wait()) |
被动(尝试锁失败) |
| 是否释放锁 | 是,立即释放 | 否,等获取锁 |
| 唤醒方式 | notify() / notifyAll() / timeout |
锁被释放,系统自动唤醒 |
| 线程状态 | WAITING / TIMED_WAITING |
BLOCKED |
| 使用场景 | 线程通信、条件等待 | 锁竞争、I/O 阻塞 |
以下是join、sleep、wait、yield关键字的区别
https://www.cnblogs.com/charlie-pang/p/18977473

浙公网安备 33010602011771号