public class T {
int count = 0;
synchronized void m() {
System.out.println(Thread.currentThread().getName() + " start");
while(true) {
count ++;
System.out.println(Thread.currentThread().getName() + " count = " + count);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(count == 5) {
int i = 1/0; //此處拋出異常,鎖將被釋放,要想不被釋放,可以在這裏進行catch,然後讓循環繼續
System.out.println(i);
}
}
}
public static void main(String[] args) {
T t = new T();
Runnable r = new Runnable() {
@Override
public void run() {
t.m();
}
};
new Thread(r, "t1").start();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(r, "t2").start();
}
}
如題, 發生異常的時候,synchronized鎖釋放,線程t2得以執行
但是要注意的是,對於顯式鎖, 如ReentrantLock,在發生異常的時候,必須要手動釋放鎖。
如果執行的代碼段有可能發生異常,我們通常要這樣處理, 需要在finally裏面釋放資源
try {
//可能發生異常的代碼
...
} catch (Exception ex) {
} finally {
//釋放鎖
lock.unlock();
//釋放IO資源
io.close();
}