synchronized关键字可以用来同步方法和代码块,保证在同一时间只有一个线程能访问被同步的代码。但是其有两个缺点:
1.无法控制阻塞时长
2.阻塞不可中断
public synchronized void syncMethod(){
try {
TimeUnit.HOURS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
SynchronizedDefect defect = new SynchronizedDefect();
Thread t1 = new Thread(defect::syncMethod,"t1");
t1.start();
TimeUnit.SECONDS.sleep(2);
Thread t2 = new Thread(defect::syncMethod,"t2");
t2.start();
TimeUnit.SECONDS.sleep(2);
t2.interrupt();
System.out.println(t2.isInterrupted());
System.out.println(t2.getState());
}
运行结果:
true
BLOCked