用代码说话:synchronized关键字和多线程访问同步方法的7种情况 (3)

解释:有static关键字,锁的是类本身;没有static关键字,锁的是对象实例;锁不是同一把锁,两个锁之间是没有冲突的;所以两个线程可以并行执行。

7. 方法抛异常后,会释放锁 public class Demo7 implements Runnable{     static Demo7 instance = new Demo7();     @Override     public void run() {         if (Thread.currentThread().getName().equals("Thread-0")){             fun1();         }else{             fun2();         }     }     public synchronized void fun1() {         System.out.println(Thread.currentThread().getName() + "开始运行");         try {             Thread.sleep(2000);         } catch (InterruptedException e) {             e.printStackTrace();         }         throw new RuntimeException();         //System.out.println(Thread.currentThread().getName() + "fun1运行结束");     }     public synchronized void fun2() {         System.out.println(Thread.currentThread().getName() + "fun2开始运行");         try {             Thread.sleep(2000);         } catch (InterruptedException e) {             e.printStackTrace();         }         System.out.println(Thread.currentThread().getName() + "运行结束");     }     public static void main(String[] args) {         Thread thread1 = new Thread(instance);         Thread thread2 = new Thread(instance);         thread1.start();         thread2.start();         while (thread1.isAlive() || thread2.isAlive()) {         }         System.out.println("finished");     } }

结果:thread1运行时遇到异常,并未运行结束,thread2开始运行,并运行至结束。

方法抛异常后,会释放锁

解释:方法抛出异常后,JVM自动释放锁。

8. 上述7种情况总结

3点核心思想:

一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待。

每个实例都对应有自己的一把锁,不同实例之间互不影响;例外:锁对象是.class以及synchronized修饰的是static方法的时候,所有对象共用同一把锁。

无论是方法正常运行完毕或者方法抛出异常,都会释放锁。

四、synchronized和ReentrantLock比较

虽然ReentrantLock是更加高级的锁机制,但是synchronized依然存在着如下的优点:

synchronized作为内置锁为更多的开发人员所熟悉,代码简洁;

synchronized较ReentrantLock更加安全,ReentrantLock如果忘记在finally中释放锁,虽然代码表面上运行正常,但实际上已经留下了隐患

synchronized在线程转储中能给出在哪些调用帧中获得了哪些琐,并能够检测和识别发生死锁的线程。

五、总结

synchronized关键字是Java提供的一种互斥的、可重入的内置锁机制。

其有两种用法:对象锁和类锁。

虽然synchronized与高级锁相比有着不够灵活、效率低等不足,但也有自身的优势:安全,依然是并发编程领域不得不学习的重要知识点。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxydx.html