`
ewon
  • 浏览: 6049 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个Java线程死锁的真实案例

    博客分类:
  • Java
阅读更多

前一段时间在做的产品中出现一个BUG,现象是界面起不来,显出Splash Screen后就停在那里。经过分析,调试后发现是传说中的线程死锁。一个已经开发了7,8年的东西,这种问题到现在才无意中暴露出来。

java 代码
  1. public class Main{   
  2.   
  3.     public synchronized void initializeDomainModel() {   
  4.         ApplicationModel model = new ApplicationModel(this);           
  5.       setDomainModel(model);   
  6.           
  7.       model.startSession(name, port, nullnull);   
  8.       model.addPropertyChangeListener(getPanel());   
  9.         try {   
  10.             wait(10000);   
  11.       } catch (InterruptedException e) {   
  12.       }   
  13.     }   
  14. }   
  15.   
  16. public class ApplicationModel extends ...{   
  17.   
  18.   public ApplicationModel(Main m){   
  19.     application = m;   
  20.   }   
  21.   
  22.     public synchronized void startSession(String host, int port,   
  23.                                     String userName, String password) {   
  24.        
  25.         ...    
  26.         applicationInterface.getXXX(this);   
  27.        
  28.     }   
  29.        
  30.        
  31.     public synchronized void serverCallback(Response response, RequestNode node)   
  32.     {   
  33.         
  34.          ...   
  35.          if (application != null) {   
  36.             synchronized(application) {   
  37.                 application.notify();   
  38.             }   
  39.             connectToDb();   
  40.          }   
  41.          ///!   
  42.     }   
  43.        
  44.     public synchronized void addPropertyChangeListener(Listener l){   
  45.     }   
  46.     ...   
  47. }  

程序流程是这样的:

1. Main是程序入口,会启动主界面。 2.  startSession方法中的getXXX(this) 会向Server端发送请求,回调函数serverCallback由另一个线程负责调用。

问题分析:

程序停在36行,说明application,也就是Main对象上的锁没有被主线程释放,而主线程之所以没有走到第10行wait,是因为在第8行addPropertyChangeListener的时候发现其他线程在执行serverCallback占用了ApplicationModel对象的锁。

解决方法:

1。Main中不需要同步整个initializeDomainModel方法,只需要将wait放入同步块即可。 2。调换model.startSession和model.addPropertyChangeListener的顺序也可以解决

 

 

分享到:
评论

相关推荐

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

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

    java模拟线程死锁

    java线程实践,了解线程死锁,同步问题

    多线程死锁

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

    java线程死锁实例

    死锁在java 线程如何解决?这个实例描述了几个人资源共享的情况

    java死锁源码java死锁源码

    java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁...

    java 一个死锁的例子

    java 一个死锁的例子 java 一个死锁的例子 java 一个死锁的例子

    java线程死锁代码示例

    主要介绍了java线程死锁代码示例,分享了一个简单线程死锁的例子,需要的朋友可以参考下。

    Java实现线程死锁

     Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻多只有一个线程执行该段代码。  当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内...

    java多线程经典案例

    java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例

    java多线程编程总结

    Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    Java多线程程序死锁检查 JCarder

    Java多线程程序死锁检查 JCarder

    Java线程讲解Java线程讲解

    Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解

    一个java线程池死锁的例子

    线程池里的线程等待等待队列里的线程执行,等待队列里的等待线程池里的完成,相互等待

    Java 线程死锁的问题解决办法

    主要介绍了 Java 线程死锁的问题解决办法的相关资料,希望通过本大家能帮助到大家,遇到类似问题能够解决,需要的朋友可以参考下

    Java线程死锁实例及解决方法

    主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java线程详解大全

    Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程

    Java多线程编程总结

    Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新...

    多线程死锁问题

    死锁问题,java多线程死锁

    Java线程Java线程Java线程Java线程

    Java线程Java线程Java线程Java线程Java线程Java线程

Global site tag (gtag.js) - Google Analytics