Java 线程创建中 BLOCKED 状态是什么意思
在 java 线程生命周期中,blocked 状态表示一个线程正在等待获取监视器锁(monitor lock)以进入同步代码块或方法。这通常发生在多个线程竞争同一把锁时,当前线程因无法立即获得锁而被阻塞,直到持有锁的线程释放锁为止。

什么情况下线程会进入 BLOCKED 状态
当线程尝试进入由 synchronized 关键字修饰的方法或代码块时,如果该对象的锁已经被其他线程持有,当前线程就会进入 BLOCKED 状态。这是最常见的场景,例如两个线程同时调用同一个实例的同步方法。

public class SyncExample {
public synchronized void methodA() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
SyncExample example = new SyncExample();
Thread t1 = new Thread(() -> example.methodA(), "Thread-1");
Thread t2 = new Thread(() -> example.methodA(), "Thread-2");
t1.start();
Thread.sleep(100); // 确保 t1 先获取锁
t2.start();
Thread.sleep(6000);
System.out.println("t2 state: " + t2.getState());
}
}
运行上述代码,t2 的状态将显示为 BLOCKED,因为它在等待 t1 释放锁。
如何区分 BLOCKED 和 WAITING 状态
BLOCKED 和 WAITING 都涉及线程暂停执行,但原因不同。BLOCKED 是由于竞争锁失败,而 WAITING 是线程主动等待其他线程的通知(如调用 Object.wait() 或 Thread.join())。BLOCKED 是被动的,WAITING 通常是主动的。

public class WaitVsBlock {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {}
}
}, "Waiter");
Thread t2 = new Thread(() -> {
synchronized (lock) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
}
}, "Blocker");
t1.start();
Thread.sleep(100);
t2.start();
Thread.sleep(2000);
System.out.println("Waiter state: " + t1.getState());
System.out.println("Blocker state: " + t2.getState());
}
}
运行后,Waiter 处于 WAITING,Blocker 处于 TIMED_WAITING(因为用了 sleep),若 Blocker 也尝试获取锁但被占,则可能为 BLOCKED。此例主要展示 wait() 导致 WAITING。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











