synchronized鎖在發生異常的時候會自動釋放鎖


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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章