当一个线程执行的代码出现异常时,其所持有的锁会自动释放

package unit2;

public class Demo7_yichangshifangsuo {
	
	public static void main(String[] args) {
		try {
			Serivce service = new Serivce();
			DemoThreadA a = new DemoThreadA(service);
			a.setName("a");
			a.start();
			Thread.sleep(500);
			DemoThreadB b = new DemoThreadB(service);
			b.setName("b");
			b.start();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class Serivce {
	synchronized public void testMethod() {
		if (Thread.currentThread().getName().equals("a")) {
			System.out.println("ThreadName=" + Thread.currentThread().getName()
					+ " run beginTime=" + 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 exceptionTime=" + System.currentTimeMillis()
							);
					Integer.parseInt("a");
				}
			}
		} else {
			System.out.println("Thread B run Time="
					+ System.currentTimeMillis());
		}
	}
}

class DemoThreadA extends Thread {
	
	private Serivce service;
	
	public DemoThreadA(Serivce service) {
		super();
		this.service = service;
	}
	
	public void run() {
		service.testMethod();
	}
}

class DemoThreadB extends Thread {
	
	private Serivce service;
	
	public DemoThreadB(Serivce service) {
		super();
		this.service = service;
	}
	
	public void run() {
		service.testMethod();
	}
}

Java多线程9:出现异常,锁自动释放
假设出现异常时线程不会释放其所持有的锁。如上所示线程a在同步方法内出现异常但是其所持有的锁并不会释放,也就是说线程b不会得到锁,也就不能执行testMethod()方法,那么else后面的语句也就得不到执行的机会,但结果else内的语句得到了执行的机会,从而得出假设不成立。故出现异常时线程会释放其所持有的锁。

相关文章: