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

posted @ 2025-07-03 22:48  Charlie-Pang  阅读(107)  评论(0)    收藏  举报