您现在的位置是:亿华云 > IT科技类资讯

java如何避免程序死锁

亿华云2025-10-05 12:28:11【IT科技类资讯】7人已围观

简介并发程序一旦死锁,往往我们只能重启应用。解决死锁问题最好的办法就是避免死锁。死锁发生的条件互斥,共享资源只能被一个线程占用占有且等待,线程 t1 已经取得共享资源 s1,尝试获取共享资源 s2 的时候

  并发程序一旦死锁,何避往往我们只能重启应用。免程解决死锁问题最好的序死办法就是避免死锁。

  死锁发生的何避条件

java如何避免程序死锁

  互斥,共享资源只能被一个线程占用

java如何避免程序死锁

  占有且等待,免程线程 t1 已经取得共享资源 s1,序死尝试获取共享资源 s2 的何避时候,不释放共享资源 s1

java如何避免程序死锁

  不可抢占,免程其他线程不能强行抢占线程 t1 占有的序死资源 s1

  循环等待,线程 t1 等待线程 t2 占有的何避资源,线程 t2 等待线程 t1 占有的免程资源

  避免死锁的方法

  对于以上 4 个条件,云南idc服务商只要破坏其中一个条件,序死就可以避免死锁的何避发生。

  对于第一个条件 "互斥" 是免程不能破坏的,因为加锁就是序死为了保证互斥。

  其他三个条件,我们可以尝试

  一次性申请所有的资源,破坏 "占有且等待" 条件

  占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源,破坏 "不可抢占" 条件

  按序申请资源,破坏 "循环等待" 条件

  使用管理类一次性申请所有的源码下载资源,破坏 "占有且等待" 条件示例

  package constxiong.concurrency.a023;

  import java.util.HashSet;

  import java.util.Set;

  /

**

  * 测试 一次性申请所有的资源,破坏 "占有且等待" 条件示例

  * @author ConstXiong

  * @date 2019-09-24 14:04:12

  */

  public class TestBreakLockAndWait {

  //单例的资源管理类

  private final static Manger manager = new Manger();

  //资源1

  private static Object res1 = new Object();

  //资源2

  private static Object res2 = new Object();

  public static void main(String[] args) {

  new Thread(() -> {

  boolean applySuccess = false;

  while (!applySuccess) {

  //向管理类,申请res1和res2,申请失败,重试

  applySuccess = manager.applyResources(res1, res2);

  if (applySuccess) {

  try {

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源成功");

  synchronized (res1) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res1 资源的锁");

  //休眠 1秒

  try {

  Thread.sleep(1000);

  } catch (Exception e) {

  e.printStackTrace();

  }

  synchronized (res2) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res2 资源的锁");

  }

  }

  } finally {

  manager.returnResources(res1, res2);//归还资源

  }

  } else {

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源失败");

  //申请失败休眠 200 毫秒后重试

  try {

  Thread.sleep(200);

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  }).start();

  new Thread(() -> {

  boolean applySuccess = false;

  while (!applySuccess) {

  //向管理类,申请res1和res2,申请失败,重试

  applySuccess = manager.applyResources(res1, res2);

  if (applySuccess) {

  try { 无锡妇科医院哪家好 http://www.xasgfk.cn/

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源成功");

  synchronized (res2) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res1 资源的锁");

  //休眠 1秒

  try {

  Thread.sleep(1000);

  } catch (Exception e) {

  e.printStackTrace();

  }

  synchronized (res1) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res2 资源的锁");

  }

  }

  } finally {

  manager.returnResources(res1, res2);//归还资源

  }

  } else {

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源失败");

  //申请失败休眠 200 毫秒后重试

  try {

  Thread.sleep(200);

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  }).start();

  }

  }

  /

**

  * 资源申请、归还管理类

  * @author ConstXiong

  * @date 2019-09-24 14:10:57

  */

  class Manger {

  //资源存放集合

  private Set

源码库

很赞哦!(3669)