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

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

}
经验分享 程序员 微信小程序 职场和发展