原文链接:出现异常锁被释放 – 编程屋
程序在执行过程中,如果出现异常,默认情况下锁被释放,所以在并发处理的过程中,有异常要多家小心,不然可能会发生不一致的情况。
比如:在一个web app处理过程中,多个servlet线程共同访问同一个资源,这是如果异常处理不合适,在第一个线程中抛出异常,其他线程就会进入到同步代码区,有可能会访问异常产生时的数据,因此要非常小心处理同步业务逻辑中的异常。
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 {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count ==5 ) {
int i = 1/0;
System.out.println(i);
}
}
}
public static void main(String[] args) {
T t = new T();
Runnable runnable = () -> t.m();
new Thread(runnable,"t1").start();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(runnable,"t2").start();
}
如上代码所示,对m()方法进行加锁,正常情况下,t2线程是不会执行m方法的,但是由于t1线程执行的时候抛出了异常,锁被释放了,所以t2线程也执行了m方法。
但是如果将异常捕获了,那么锁不会被释放。
运行结果:
以上只是部分内容,为了维护方便,本文已迁移到新地址:出现异常锁被释放 – 编程屋