线程遇到异常的时候就会释放锁

本文通过一个Java示例,展示了当线程在synchronized方法中遇到异常时,锁是如何被释放的。通过创建两个线程A和B,线程A在运行过程中故意触发异常,而线程B随后启动,验证了异常情况下锁的释放机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这个Service中的Integer.paseInt(“a”)一定会发成异常,然后再测试类中使用了Thread进行了sleep,然后可以观察到结果就是线程A执行的时候已经进入到异常的代码块中。此时已经释放了锁。但是B也启动了线程,但是b不满足判断的条件,所以B进入了else。从这里看出线程遇到异常的时候就会释放锁。
在这里插入图片描述

package com.mayuhan.throwExceptionLock;

public class Service {

	synchronized public void testMethod() {
		if(Thread.currentThread().getName().equals("a")) {
			System.out.println("ThreadName="+Thread.currentThread().getName()+"runTime"+System.currentTimeMillis());
			int i =1;
			while(i == 1) {
				if((""+Math.random()).substring(0,8).equals("0.123456")) {
					System.out.println("ThreadName="+Thread.currentThread().getName()+"run exception time = "+System.currentTimeMillis());
					Integer.parseInt("a");
				}
			}
		}else {
			System.out.println("Thread B run time"+System.currentTimeMillis());
		}
	}
}

创建线程A

package com.mayuhan.throwExceptionLock;

public class ThreadA extends Thread{

	private Service service;
	
	public ThreadA( Service service) {
		this.service = service;
	}
	@Override
	public void run() {
		super.run();
		service.testMethod();
	}
}

创建线程B

package com.mayuhan.throwExceptionLock;

public class ThreadB extends Thread{

	private Service service;
	
	public ThreadB( Service service) {
		this.service = service;
	}
	@Override
	public void run() {
		super.run();
		service.testMethod();
	}
}

创建了测试类进行测试

package com.mayuhan.throwExceptionLock;

public class Test {
	public static void main(String[] args) {
		try {
			Service service = new Service();
			ThreadA t1 = new ThreadA(service);
			t1.setName("a");
			t1.start();
			Thread.sleep(5000);
			ThreadB t2 = new ThreadB(service);
			t2.setName("b");
			t2.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值