synchronized重入后抛出异常,锁释放了吗

Posted catchmydream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized重入后抛出异常,锁释放了吗相关的知识,希望对你有一定的参考价值。

synchronized用于同步方法或者代码块,使得多个线程在试图并发执行同一个代码块的时候,串行地执行。以达到线程安全的目的。

在多线程的时候是这样的,但是对于单线程,是允许重入的,每重入一次,计数器加1,当退出代码块时,计数器减1。

那正常退出时计数器减1,抛异常时计数器也是减1。那如果两次重入,在内层抛出异常,会释放锁吗?还是只会计数器减1,锁并不会释放?

直接上代码验证:

public class SynchronizedTest1 {
    public static void main(String[] args){
        Test test1 = new Test();
        Thread thread1 = new Thread(test1);
        Thread thread2 = new Thread(test1);
        thread1.start();
        thread2.start();
    }
}
class Test implements Runnable{
    public synchronized void hello() throws Exception{
        System.out.println(Thread.currentThread().getName() + " say hello!!");
        sorry();
        System.out.println(Thread.currentThread().getName() + " helloed");
    }
    public synchronized void sorry() throws Exception{
        System.out.println(Thread.currentThread().getName() + " say sorry!!");
        throw new Exception(Thread.currentThread().getName() + " this is a test!");
    }
    public void run() {
        try {
            hello();
        }catch (Exception e){
            System.out.println(Thread.currentThread().getName() + " exception once");
        }
        try {
            Thread.sleep(10000L);
            System.out.println(Thread.currentThread().getName() + " exit");
        }catch (Exception e){
            System.out.println(Thread.currentThread().getName() + " some exception");
        }
    }
}
Thread-0 say hello!!
Thread-0 say sorry!!
Thread-0 exception once
Thread-1 say hello!!
Thread-1 say sorry!!
Thread-1 exception once
Thread-1 exit
Thread-0 exit

Process finished with exit code 0

  

从以上运行结果,得出以下结论

结论:synchronized重入之后,抛出异常,跳出synchronized代码块,会释放锁。

以上是关于synchronized重入后抛出异常,锁释放了吗的主要内容,如果未能解决你的问题,请参考以下文章

Java Thread系列synchronized

并发编程:锁重入与锁异常

5.并发编程-synchronized 细节说明

总结:一文死磕 synchronized 和 AQS 系

总结:一文死磕 synchronized 和 AQS 系

ReentrantLock 重入锁