`
youyu4
  • 浏览: 440088 次
社区版块
存档分类
最新评论

Java多线程之死锁

 
阅读更多

Java多线程之死锁

 

什么是死锁

 

      A、B两台车过桥,桥只能过一台车,A、B分别是桥的两头,A不让B,B不让A

 

 

 

怎么查出死锁(两种方法)

 

方法一

  • JConsole找到本地进程
  • 找到线程选项卡,然后检查死锁
  • 找到blocked状态的线程,看它需要资源的拥有者

方法二

  • JVM自带的命令jps查看进程
  • Jstack查看栈的使用情况

 

 

怎样从死锁中恢复过来

 

     1. 重启系统,代价大,之前的工作白费,所有正在运行的现场都去掉了

 

     2. 撤销进程,剥夺资源。终止参与死锁的进程,回收他们占的资源,从而解除死锁。这又分两种,一次性撤销参与死锁的全部进程,剥夺全部资源;或者逐步撤销参与死锁的进程。一般来说,逐步撤销要按一定的原则,目的是撤销代价最小的进程,比如按优先级确定线程代价。

 

     3. 进程回退,死锁的线程回退到没有发生死锁的某一点,继续执行。

 

 

 

死锁条件

 

  • 互斥:资源在一段时间内只能被一个线程使用
  • 不可抢占:不能强行从别的线程将资源抢走
  • 占有且申请:自己占有资源,又申请另一个资源
  • 循环

 

 

避免死锁的方法

 

  • 打破上面的条件,就能解除或避免死锁
  • 避免嵌套锁,只有需要的地方使用锁
  • 避免无限期等待也是避免死锁的常用方法
  • 使用一些避免死锁的算法:有序资源分配法、银行家算法

 

 

N个线程访问N个资源,同时不死锁,用下面算法解决

 

有序资源排序法

 

线程所需要的资源统一编号,申请资源时一定要按照编号顺序申请。

例子

  1. 线程A使用资源的顺序时R1、R2,线程B使用资源的顺序是R2、R1,这样就可能导致死锁
  2. 有序资源分配法:R1编号为1,R2编号为2
  3. A申请资源的顺序是R1、R2,B申请资源的顺序是R1、R2,就不会出现死锁了

 

银行家算法

 

  1. 当线程首次申请资源时,要测试改线程对资源的最大需求量,如果资源能满足最大请求量,就分配,否则推迟分配
  2. 当线程在执行中继续申请资源,先测试该线程本次申请的资源数是否超过了该资源所剩余的总量,如满足则分配,不满足则推迟

 

分享到:
评论

相关推荐

    Java多线程之死锁的出现和解决方法

    Java多线程之死锁的出现和解决方法 死锁是指多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不能正常运行。死锁的出现是由于不适当地运用“synchronized”...

    Java多线程之-死锁.doc

    Java 多线程之死锁 Java 多线程中的死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于 synchronized 的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个...

    Java多线程程序死锁检查 JCarder

    Java多线程编程是开发高并发应用的关键技术之一,但随之而来的是各种复杂的问题,其中最令人头疼的就是死锁。死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。JCarder是Java中用于检测...

    多线程死锁

    明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。

    java多线程死锁预防机制研究

    ### Java多线程死锁预防机制研究 #### 摘要 随着计算机技术的发展和软件系统日益复杂的背景下,多线程编程技术得到了广泛的应用。多线程能够显著提高程序的执行效率,但也随之带来了诸如死锁等问题。死锁是指两个或...

    JAVA源码Java多线程程序死锁检查JCarder

    JAVA源码Java多线程程序死锁检查JCarder

    java资源Java多线程程序死锁检查JCarder

    java资源Java多线程程序死锁检查 JCarder提取方式是百度网盘分享地址

    基于java的开发源码-多线程程序死锁检查 JCarder.zip

    基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...

    java源码:Java多线程程序死锁检查 JCarder.zip

    Java多线程编程是开发高并发应用的关键技术之一,但随之而来的问题也十分复杂,比如死锁。死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。本资料...

    java模拟线程死锁

    在 Java 中,线程死锁(Deadlock)是一种特殊的情况,发生在两个或多个线程之间的互相等待对方释放资源的状态。这种情况下,各个线程都在等待其他线程释放资源,而自己也占用着其他线程需要的资源,从而导致所有线程...

    Java多线程程序死锁检查 JCarder.7z

    Java多线程编程是开发高并发应用的关键技术之一,但同时也带来了复杂性和潜在的问题,比如死锁。死锁是指两个或多个并发线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,它们都将无法推进...

    java多线程及死锁.doc

    Java 多线程是编程中一个重要的概念,它允许程序同时执行多个任务,提升系统效率。在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。继承Thread类时,重写run()方法,然后通过实例化并调用start...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    基于Java的多线程程序死锁检查 JCarder.zip

    5. **JCarder工具**:`JCarder`是一个专门针对Java多线程死锁的检测工具,它通过分析线程的同步状态和资源持有情况,找出可能存在的死锁链。 三、JCarder的使用与原理 6. **使用方法**:首先,将`JCarder`工具集成...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    JAVA多线程编程技术PDF

    总结起来,“JAVA多线程编程技术PDF”涵盖了多线程的基本概念、同步机制、线程通信、死锁避免、线程池以及线程安全的集合类等内容。通过深入学习这份资料,开发者可以全面掌握Java多线程编程技术,提升程序的并发...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

Global site tag (gtag.js) - Google Analytics