Java 多线程编程(四)之锁的释放(异常出现)

知识点:synchronized 获取的锁,在方法抛出异常的时候会自动解锁

/**
 * 程序在执行过程中,如果出现异常,默认情况锁会被释放
 * 所以在并发处理过程中,有异常要多加小心,不然可能会发生不一致的情况
 * 比如,在一个web app处理过程中,多个servlet线程共同访问同一个资源,这时如果异常处理不合适
 * 在第一个线程中抛出异常,其他线程就会进入同步代码区,有可能会访问到异常产生时的数据
 * 因此要非常小心地处理同步业务逻辑中的异常
 * @author Forever
 */
import java.util.concurrent.TimeUnit;
public class Java_dxc011 {
	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(2);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			
			if(count == 5) {
				 int i = 1/0 ; //此处抛出异常,锁会被释放,要想不被释放,可以在这里进行catch,然后让循环继续
			}
			}
	}
	public static void main(String[] args) {
		Java_dxc011 t=new Java_dxc011();
		Runnable r= new Runnable() {
			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();
	}

}

输出:

t1 start。。。
t1 count =1
t1 count =2
t1 count =3
t1 count =4
t1 count =5
Exception in thread "t1" t2 start。。。
t2 count =6
java.lang.ArithmeticException: / by zero
	at Java_dxc011.m(Java_dxc011.java:24)
	at Java_dxc011$1.run(Java_dxc011.java:32)
	at java.base/java.lang.Thread.run(Thread.java:834)
t2 count =7
t2 count =8
t2 count =9
t2 count =10
t2 count =11
t2 count =12
t2 count =13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值