synchronized锁在发生异常的时候会自动释放锁

mac2024-04-13  34

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

 

最新回复(0)