java 多线程 出现异常锁自动释放

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进入

从这里可以看出,释放锁的并不是产生异常,而是方法结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值