synchronized 关键字缺陷
- 无法控制阻塞时间
- 因争夺某个monitor的锁进入阻塞状态,那么它是无法中断的
举例
public class SynchronizedDetect {
public synchronized void detect() {
try {
System.out.println(Thread.currentThread().getName() + " detect..");
TimeUnit.HOURS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
SynchronizedDetect synchronizedDetect = new SynchronizedDetect();
Thread t1 = new Thread(synchronizedDetect::detect, "t1");
t1.start();
TimeUnit.SECONDS.sleep(2);
Thread t2 = new Thread(synchronizedDetect::detect, "t2");
t2.start();
t2.interrupt();
System.out.println(t2.isInterrupted());
System.out.println(t2.getState());
}
}
运行结果:
t1 detect..
true
RUNNABLE
t2 在抢夺 synchronizedDetect 对象的monitor 锁而进入阻塞状态,虽然可以设置t2 的中断标识, 但是它是无法被中断的, t2 的线程状态依然是 block