文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java项目中出现死锁如何解决

2023-05-31 15:32

关注

Java项目中出现死锁如何解决?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

java 死锁产生的四个必要条件:

1>互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

2>不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

3>请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的战友。

4>循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。

解决死锁问题的方法是:一种是用synchronized,一种是用Lock显式锁实现。

而如果不恰当的使用了锁,且出现同时要锁多个对象时,会出现死锁情况,如下:

import java.util.Date;public class LockTest {  public static String obj1 = "obj1";  public static String obj2 = "obj2";  public static void main(String[] args) {   LockA la = new LockA();   new Thread(la).start();   LockB lb = new LockB();   new Thread(lb).start();  }}class LockA implements Runnable{  public void run() {   try {     System.out.println(new Date().toString() + " LockA 开始执行");     while(true){      synchronized (LockTest.obj1) {        System.out.println(new Date().toString() + " LockA 锁住 obj1");        Thread.sleep(3000); // 此处等待是给B能锁住机会        synchronized (LockTest.obj2) {         System.out.println(new Date().toString() + " LockA 锁住 obj2");         Thread.sleep(60 * 1000); // 为测试,占用了就不放        }      }     }   } catch (Exception e) {     e.printStackTrace();   }  }}class LockB implements Runnable{  public void run() {   try {     System.out.println(new Date().toString() + " LockB 开始执行");     while(true){      synchronized (LockTest.obj2) {        System.out.println(new Date().toString() + " LockB 锁住 obj2");        Thread.sleep(3000); // 此处等待是给A能锁住机会        synchronized (LockTest.obj1) {         System.out.println(new Date().toString() + " LockB 锁住 obj1");         Thread.sleep(60 * 1000); // 为测试,占用了就不放        }      }     }   } catch (Exception e) {     e.printStackTrace();   }  }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯