Java并发编程如何防止死锁? 我就是我 2024-05-23 22:03 31阅读 0赞 死锁可能是大家都不想遇到的问题,因为一旦程序出现死锁,如果没有外力的话,程序会因为资源竞争一直处于假死状态。 死锁示例代码如下: <b>public</b> <b>class</b> DeadLockTest { <b>public</b> <b>static</b> String OBJECT_1 = <font>"OBJECT_1"</font><font>; <b>public</b> <b>static</b> String OBJECT_2 = </font><font>"OBJECT_2"</font><font>; <b>public</b> <b>static</b> <b>void</b> main(String[] args) { LockA lockA = <b>new</b> LockA(); <b>new</b> Thread(lockA).start(); LockB lockB = <b>new</b> LockB(); <b>new</b> Thread(lockB).start(); } } <b>class</b> LockA implements Runnable { @Override <b>public</b> <b>void</b> run() { <b>synchronized</b> (DeadLockTest.OBJECT_1) { <b>try</b> { Thread.sleep(500); <b>synchronized</b> (DeadLockTest.OBJECT_2) { System.out.println(</font><font>"LockA"</font><font>); } } <b>catch</b> (InterruptedException e) { e.printStackTrace(); } } } } <b>class</b> LockB implements Runnable { @Override <b>public</b> <b>void</b> run() { <b>synchronized</b> (DeadLockTest.OBJECT_2) { <b>try</b> { Thread.sleep(500); <b>synchronized</b> (DeadLockTest.OBJECT_1) { System.out.println(</font><font>"LockB"</font><font>); } } <b>catch</b> (InterruptedException e) { e.printStackTrace(); } } } } </font> 当一个线程获得了 OBJECT\_1 锁时,它并没有释放锁,然后再申请 OBJECT\_2 锁。 这时,另一个线程获取了OBJECT\_2锁,并没有释放锁去申请OBJECT\_1锁。 由于 OBJECT\_1 和 OBJECT\_2 锁都没有被释放,所以两个线程会一起请求,陷入死循环,即出现死锁情况。 那么如果避免了死锁问题呢? **\# 1. 缩小锁的范围。** 死锁情况可能是如上锁范围过大造成的。 那么,解决方案就是缩小锁的范围。 <b>class</b> LockA implements Runnable { @Override <b>public</b> <b>void</b> run() { <b>synchronized</b> (DeadLockTest.OBJECT_1) { <b>try</b> { Thread.sleep(500); } <b>catch</b> (InterruptedException e) { e.printStackTrace(); } } <b>synchronized</b> (DeadLockTest.OBJECT_2) { System.out.println(<font>"LockA"</font><font>); } } } <b>class</b> LockB implements Runnable { @Override <b>public</b> <b>void</b> run() { <b>synchronized</b> (DeadLockTest.OBJECT_2) { <b>try</b> { Thread.sleep(500); } <b>catch</b> (InterruptedException e) { e.printStackTrace(); } } <b>synchronized</b> (DeadLockTest.OBJECT_1) { System.out.println(</font><font>"LockB"</font><font>); } } } </font> 在获取 OBJECT\_1 锁的代码块中,不包含获取 OBJECT\_2 锁的代码。 同时,获取OBJECT\_2锁的代码块中不包含获取OBJECT\_1锁的代码。 **\# 2. 保证锁的顺序。** 在死锁的情况下,线程获取锁的顺序是OBJECT\_1和OBJECT\_2。 另一个线程以相反的顺序获取锁:OBJECT\_2 和 OBJECT\_1。 那么,如果我们能保证每次获取锁的顺序都是一样的,就不会出现死锁问题。 <b>class</b> LockA implements Runnable { @Override <b>public</b> <b>void</b> run() { <b>synchronized</b> (DeadLockTest.OBJECT_1) { <b>try</b> { Thread.sleep(500); <b>synchronized</b> (DeadLockTest.OBJECT_2) { System.out.println(<font>"LockA"</font><font>); } } <b>catch</b> (InterruptedException e) { e.printStackTrace(); } } } } <b>class</b> LockB implements Runnable { @Override <b>public</b> <b>void</b> run() { <b>synchronized</b> (DeadLockTest.OBJECT_1) { <b>try</b> { Thread.sleep(500); <b>synchronized</b> (DeadLockTest.OBJECT_2) { System.out.println(</font><font>"LockB"</font><font>); } } <b>catch</b> (InterruptedException e) { e.printStackTrace(); } } } } </font> 两个线程,每个线程先获取 OBJECT\_1 锁,然后再获取 OBJECT\_2 锁。
相关 Java并发编程:死锁示例 死锁是多线程并发编程中的一种严重问题,当一个或多个线程因等待其他线程释放已获得的资源而造成的一种相互“僵持”的状态时,就可能发生死锁。 下面是一个经典的死锁示例(使用Java 痛定思痛。/ 2024年09月18日 03:36/ 0 赞/ 11 阅读
相关 Java并发编程:如何避免死锁问题 死锁是多线程编程中的一种严重问题,当两个或更多的线程在执行过程中因争夺资源而造成的一种互相等待的现象称为死锁。 为了避免死锁,可以遵循以下策略: 1. **预防死锁**: - 日理万妓/ 2024年09月16日 10:18/ 0 赞/ 12 阅读
相关 Java中并发编程如何避免死锁问题? 在Java中,避免死锁主要遵循以下四个原则: 1. **互斥(Mutual Exclusion)**:每个资源在任何时候只能被一个进程使用。当一个进程申请了某个资源后,必须释 女爷i/ 2024年09月15日 14:48/ 0 赞/ 12 阅读
相关 Java并发编程中如何避免死锁 在Java并发编程中,死锁是一种严重的性能问题,它发生在两个或更多的线程互相等待对方释放资源的情况下。 以下是一些避免死锁的策略: 1. 避免嵌套锁:一个线程获取了多个锁后 矫情吗;*/ 2024年09月11日 16:09/ 0 赞/ 22 阅读
相关 Java并发编程如何防止死锁? 由于 OBJECT_1 和 OBJECT_2 锁都没有被释放,所以两个线程会一起请求,陷入死循环,即出现死锁情况。当一个线程获得了 OBJECT_1 锁时,它并没有释放锁... 我就是我/ 2024年05月23日 22:03/ 0 赞/ 32 阅读
相关 JAVA并发编程——死锁 目录 什么是死锁? 动手写死锁 发现排查死锁情况 解决办法 每日寄语 -------------------- 什么是死锁? 死锁不仅在个人学习中,甚 曾经终败给现在/ 2024年03月25日 23:16/ 0 赞/ 46 阅读
相关 java并发编程—死锁 死锁 死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行下去。 死锁的解决方法有以下几种: 1. 避免死锁 淩亂°似流年/ 2023年10月12日 12:34/ 0 赞/ 22 阅读
相关 并发编程学习(5) —— 如何解决死锁 前沿 在[并发编程学习(4) —— 互斥锁如何保护多个资源][4_ _]中讲述了入好保护关联资源以及不关联资源,但是里面的方法并不是最好,要想性能提高就要优化,但同样也会 亦凉/ 2022年03月01日 13:36/ 0 赞/ 236 阅读
还没有评论,来说两句吧...