方法抛出异常后,会释放锁(synchronized)

示例代码

public class TestMain implements Runnable {
    //格式化
    static SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void run() {
        //让线程Thread-0执行同步方法1
        if ("Thread-0".equals(Thread.currentThread().getName())) {
            synchronizedMethod();
        } else {
            //让线程Thread-1执行同步方法2
            synchronizedMethod2();
        }
    }


    public synchronized void synchronizedMethod() {
        Date satrtTime = new Date();
        String time = sim.format(satrtTime);
        System.out.println(time + ":【" + Thread.currentThread().getName() + "访问了同步方法1】");
        try {
            //睡眠3秒
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Date endTime = new Date();
        String time2 = sim.format(endTime);
        System.out.println(time2 + ":【" + Thread.currentThread().getName() + "准备抛出异常了】");
        throw new RuntimeException();
    }

    public synchronized void synchronizedMethod2() {
        Date satrtTime = new Date();
        String time = sim.format(satrtTime);
        System.out.println(time + ":【" + Thread.currentThread().getName() + "访问了同步方法2】");
        try {
            //睡眠3秒
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Date endTime = new Date();
        String time2 = sim.format(endTime);
        System.out.println(time2 + ":【" + Thread.currentThread().getName() + "准备退出这个同步方法了2】");
    }

    public static void main(String[] args) throws Exception {
        //创建一个对象testMain1
        TestMain testMain1 = new TestMain();
        System.out.println("运行开始");
        Thread thread1 = new Thread(testMain1);
        Thread thread2 = new Thread(testMain1);
        thread1.start();
        thread2.start();
        //让主线程做个等待,等线程一和线程二都执行完它才继续执行
        thread1.join();
        thread2.join();
        System.out.println("运行结束");
    }
}

运行结果:
在这里插入图片描述

总结

从运行结果可以看出,Thread-0线程抛出异常后,Thread-1线程能够继续执行,说明Thread-0线程在抛出异常后释放了锁,Thread-1线程才能获取到锁并进入同步方法执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值