1.这是书上的书法,但是我通过验证发现也并不是那么准确
新建一个serivce类
public class Service {
synchronized public void service() throws Exception {
if(Thread.currentThread().getName().equals("a")){
System.out.println(Thread.currentThread().getName() + "进入");
Integer.parseInt("a");
}else{
System.out.println(Thread.currentThread().getName() + "进入");
}
}
}
建立线程类:
public class MyThread extends Thread {
private final Service service;
MyThread(Service service){
this.service = service;
}
@Override
public void run() {
super.run();
try {
service.service();
} catch (Exception e) {
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("进入异常");
}
}
}
测试类:
public class Demo {
public static void main(String[] args) {
Service s = new Service();
MyThread a = new MyThread(s);
a.setName("a");
a.start();
MyThread b = new MyThread(s);
b.setName("b");
b.start();
}
a进入
b进入
进入异常
从这里,似乎真的可以看出 b线程比异常先抛出,在run方法抛出异常的时候,锁就被释放掉,但这也只能说明异常是方法完结,锁才被交了出来。
下面在写一个例子:
public class Service {
synchronized public void service() {
try {
if(Thread.currentThread().getName().equals("a")){
System.out.println(Thread.currentThread().getName() + "进入");
Integer.parseInt("a");
}else{
System.out.println(Thread.currentThread().getName() + "进入");
}
} catch (NumberFormatException e) {
System.out.println("进入异常");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
public class MyThread extends Thread {
private final Service service;
MyThread(Service service){
this.service = service;
}
@Override
public void run() {
super.run();
service.service();
}
}
demo打印:
a进入
进入异常
b进入
从这里可以看出,释放锁的并不是产生异常,而是方法结束。