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

 

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