synchronized 和异常的关系

synchronized 和异常的关系,如果没有对异常进行try,则会释放锁,结束线程执行

测试代码如下

/**
 * synchronized 和异常的关系
 * T2线程能否执行?
 */
@Slf4j(topic = "test")
public class Demo {
    Object o = new Object();

    int count = 0;

     void test(){
         synchronized(o) {
             //t1进入并且启动
             log.debug(Thread.currentThread().getName() + " start......");
             //t1 会死循环 t1 讲道理不会释放锁
             while (true) {
                 count++;
                 log.debug(Thread.currentThread().getName() + " count = " + count);
                 try {
                     TimeUnit.SECONDS.sleep(1);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
                 //加5次之后 发生异常
                 /**
                  * 如果程序发生异常如果没有try 则会释放锁
                  * 反之不会释放锁
                  */
                 if (count == 5) {
                     int i = 1 / 0;
                 }
             }
         }
    }

    public static void main(String[] args) {
        Demo demo11 = new Demo();
       // Runnable r = () -> demo11.test();
       // new Thread(r, "t1").start();

        new Thread(()->{
            demo11.test();
        },"t1").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(()->{
            demo11.test();
        }, "t2").start();
    }

}

 

打印结果

17:23:39.128 [t1] DEBUG test - t1 start......
17:23:39.132 [t1] DEBUG test - t1 count = 1
17:23:40.132 [t1] DEBUG test - t1 count = 2
17:23:41.133 [t1] DEBUG test - t1 count = 3
17:23:42.133 [t1] DEBUG test - t1 count = 4
17:23:43.134 [t1] DEBUG test - t1 count = 5
Exception in thread "t1" 17:23:44.135 [t2] DEBUG test - t2 start......
17:23:44.135 [t2] DEBUG test - t2 count = 6
java.lang.ArithmeticException: / by zero
    at com.fala.base.test.demo8.Demo.test(Demo.java:36)
    at com.fala.base.test.demo8.Demo.lambda$main$0(Demo.java:48)
    at java.lang.Thread.run(Thread.java:745)
17:23:45.135 [t2] DEBUG test - t2 count = 7
17:23:46.136 [t2] DEBUG test - t2 count = 8
17:23:47.137 [t2] DEBUG test - t2 count = 9
17:23:48.137 [t2] DEBUG test - t2 count = 10
17:23:49.138 [t2] DEBUG test - t2 count = 11
17:23:50.139 [t2] DEBUG test - t2 count = 12
17:23:51.139 [t2] DEBUG test - t2 count = 13
17:23:52.139 [t2] DEBUG test - t2 count = 14
17:23:53.140 [t2] DEBUG test - t2 count = 15
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
synchronizedJava中用于实现线程同步的关键字。它可以用于三种不同的应用方式:作用于实例方法、作用于静态方法和作用于同步代码块。\[1\]当synchronized作用于实例方法时,它会锁住当前实例对象,确保同一时间只有一个线程可以执行该方法。当synchronized作用于静态方法时,它会锁住整个类,确保同一时间只有一个线程可以执行该静态方法。当synchronized作用于同步代码块时,它会锁住指定的对象,确保同一时间只有一个线程可以执行该代码块。\[1\]\[2\] 在使用synchronized时,需要注意以下几个关键点: 1. synchronized具有可重入性,即一个线程可以多次获取同一个锁。 2. 线程中断与synchronized关系:当一个线程在等待获取锁的过程中被中断时,它会抛出InterruptedException异常,并且释放已经获取到的锁。 3. 线程的等待唤醒机制与synchronized关系:通过wait()方法和notify()/notifyAll()方法,线程可以在等待某个条件满足时进入等待状态,然后在条件满足时被唤醒继续执行。 4. synchronized的底层实现原理包括Java对象头与Monitor、偏向锁、轻量级锁、自旋锁和锁消除等。\[1\] 总之,synchronizedJava中用于实现线程同步的关键字,可以通过作用于实例方法、静态方法或同步代码块来实现线程的同步操作。同时,需要注意synchronized的可重入性、与线程中断和等待唤醒机制的关系,以及其底层实现原理。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [深入理解Java并发之synchronized实现原理](https://blog.csdn.net/javazejian/article/details/72828483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [synchronized详解](https://blog.csdn.net/m0_53474063/article/details/112389756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值