当一个线程执行的代码出现异常时,其所持有的锁会自动释放
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();
}
}
假设出现异常时线程不会释放其所持有的锁。如上所示线程a在同步方法内出现异常但是其所持有的锁并不会释放,也就是说线程b不会得到锁,也就不能执行testMethod()方法,那么else后面的语句也就得不到执行的机会,但结果else内的语句得到了执行的机会,从而得出假设不成立。故出现异常时线程会释放其所持有的锁。