美文网首页
同步块内的线程抛出异常锁是否还在

同步块内的线程抛出异常锁是否还在

作者: IAmWhoAmI | 来源:发表于2018-05-03 08:32 被阅读164次
public class Test {
    public static void main(String[] args) throws InterruptedException {
        final Object o = new Object();
        Runnable r1 = new Runnable() {
            public void run() {
                synchronized (o) {
                    throw new RuntimeException("throws");
                }
            }
        };
        Runnable r2 = new Runnable() {
            public void run() {
                synchronized(o) {
                    System.out.println("acquire lock");
                }
            }
        };
        
        new Thread(r1).start();
        Thread.sleep(1000);
        new Thread(r2).start();
            
    }

}

运行结果:

Exception in thread "Thread-0" java.lang.RuntimeException: throws
    at Test$1.run(Test.java:11)
    at java.lang.Thread.run(Thread.java:748)
acquire lock

如果是lock 就不能这样:下面是错误的示例

public class Test {
    public static void main(String[] args) throws InterruptedException {
        final Object o = new Object();
        final Lock lock =new Lock();
        Runnable r1 = new Runnable() {
            public void run() {
                try {
                    lock.lock();
                    if(true)
                        throw new RuntimeException("throws");
                    lock.unlock();
                }catch (Exception e){

                }
            }
        };
        Runnable r2 = new Runnable() {
            public void run() {
                synchronized(o) {
                    try {
                        System.out.println("开始");
                        lock.lock();
                    System.out.println("acquire lock");
                        lock.unlock();
                }catch (Exception e){

                }
                }
            }
        };

        new Thread(r1).start();
        Thread.sleep(1000);
        new Thread(r2).start();

    }

}

正确的示例:所以一定要记得在finally 中释放锁。

public class Test {
    public static void main(String[] args) throws InterruptedException {
        final Object o = new Object();
        final Lock lock =new Lock();
        Runnable r1 = new Runnable() {
            public void run() {
                try {
                    lock.lock();
                    if(true)
                        throw new RuntimeException("throws");

                }catch (Exception e){

                }finally {
                    lock.unlock();
                }
            }
        };
        Runnable r2 = new Runnable() {
            public void run() {
                synchronized(o) {
                    try {
                        System.out.println("开始");
                        lock.lock();
                        System.out.println("acquire lock");
                    }catch (Exception e){

                    }finally {
                        lock.unlock();
                    }
                }
            }
        };

        new Thread(r1).start();
        Thread.sleep(1000);
        new Thread(r2).start();

    }

}

相关文章

  • 同步块内的线程抛出异常锁是否还在

    运行结果: 如果是lock 就不能这样:下面是错误的示例 正确的示例:所以一定要记得在finally 中释放锁。

  • 史上最详细Java多线程面试题及答案!

    synchronized实现原理 当一个线程试图访问同步代码块时,他首先必须得到锁,退出或抛出异常时必须释放锁。那...

  • 万字长文!从底层开始带你了解并发编程,彻底帮你搞懂java锁!

    线程是否要锁住同步资源 锁住 悲观锁 不锁住 乐观锁 锁住同步资源失败 线程是否要阻塞 阻塞 不阻塞自旋锁,适应性...

  • 线程锁概念

    synchronized 和 volatile 使用 线程抛出异常,锁会被释放 如下demo 如果不想释放那把线程...

  • 十一 .Java并发工具

    Java中的锁 锁是一种线程同步机制,类似同步块,但是锁比Java的同步块更复杂。锁(以及其他更高级的同步机制)是...

  • ReentrantLock 源码解析(JDK1.8)

    ReentrantLock简单使用demo如下: 注:获取的锁代码要放到try块之外,防止获得锁代码异常,抛出异常...

  • 多线程之_释放锁

    以下操作将会释放锁 1、当前线程的同步方法、同步代码块执行完毕2、当前线程在同步代码块、同步方法中遇到break、...

  • JUC学习笔记三

    JUC学习笔记三 用于解决多线程同步问题的方式 隐式锁(synchronized) 同步代码块 同步方法 显式锁(...

  • ②synchronized同步代码块

    synchronized同步锁 运行结果: 线程1开始工作,执行到 1/0的时候,报异常,立马释放锁,线程2开始执行。

  • 8. Java的Lock锁

    Lock和synchronized同步块一样,是线程的同步机制,而且锁是由synchronized同步块的方式进行...

网友评论

      本文标题:同步块内的线程抛出异常锁是否还在

      本文链接:https://www.haomeiwen.com/subject/jwtkrftx.html