package synchornizeds;
import java.util.concurrent.TimeUnit;
import jishuqisuanfa.Main;
/*
*
* 程序在执行过程中,如果出现异常,默认情况锁会被释放
* 所以在并发处理的过程中,有异常要多加小心,不然可能会发生不一致的情况
* 比如,在一个web app处理的过程中,有多个servlet线程同时访问一个资源,这时如果异常处理不合适,、
* 在第一个线程中抛出异常,其他线程就会就如同步代码区,
*有可能会访问到异常产生的数据
*因此要非常小心的处理同步业务逻辑中的异常
*
*/
public class Demo9 {
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(count == 5) {
int i = 1/0;
// 此处抛出异常 锁将被释放 要想不被释放 可以在这里进行catch 然后让循环继续
}
}
}
public static void main(String[] args) {
Demo9 d = new Demo9();
//new Thread(()->d.m(),"t1").start();
Runnable r = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
d.m();
}
};
new Thread(r,"d1").start();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(r,"d2").start();
}
}
结果显示:
d1 start..
d1: count = 1
d1: count = 2
d1: count = 3
d1: count = 4
d1: count = 5
d2 start..
d2: count = 6Exception in thread "d1"
java.lang.ArithmeticException: / by zero
at synchornizeds.Demo9.m(Demo9.java:33)
at synchornizeds.Demo9$1.run(Demo9.java:49)
at java.lang.Thread.run(Thread.java:748)
d2: count = 7
d2: count = 8
d2: count = 9
d2: count = 10
如果我们不让异常发生后的锁释放,可以使用try-catch
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(count == 5) {
int i = 1/0;
// 此处抛出异常 锁将被释放 要想不被释放 可以在这里进行catch 然后让循环继续
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
d1 start..
d1: count = 1
d1: count = 2
d1: count = 3
d1: count = 4
d1: count = 5
java.lang.ArithmeticException: / by zero
d1: count = 6
at synchornizeds.Demo9.m(Demo9.java:34)
at synchornizeds.Demo9$1.run(Demo9.java:54)
at java.lang.Thread.run(Thread.java:748)
d1: count = 7
d1: count = 8
d1: count = 9
d1: count = 10
d1: count = 11
d1: count = 12