前一段时间在做的产品中出现一个BUG,现象是界面起不来,显出Splash Screen后就停在那里。经过分析,调试后发现是传说中的线程死锁。一个已经开发了7,8年的东西,这种问题到现在才无意中暴露出来。
java 代码
- public class Main{
-
- public synchronized void initializeDomainModel() {
- ApplicationModel model = new ApplicationModel(this);
- setDomainModel(model);
-
- model.startSession(name, port, null, null);
- model.addPropertyChangeListener(getPanel());
- try {
- wait(10000);
- } catch (InterruptedException e) {
- }
- }
- }
-
- public class ApplicationModel extends ...{
-
- public ApplicationModel(Main m){
- application = m;
- }
-
- public synchronized void startSession(String host, int port,
- String userName, String password) {
-
- ...
- applicationInterface.getXXX(this);
-
- }
-
-
- public synchronized void serverCallback(Response response, RequestNode node)
- {
-
- ...
- if (application != null) {
- synchronized(application) {
- application.notify();
- }
- connectToDb();
- }
-
- }
-
- public synchronized void addPropertyChangeListener(Listener l){
- }
- ...
- }
程序流程是这样的:
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的顺序也可以解决
分享到:
- 2007-06-28 16:08
- 浏览 4839
- 评论(0)
- 论坛回复 / 浏览 (0 / 3294)
- 查看更多
相关推荐
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语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻多只有一个线程执行该段代码。 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内...
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-...
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
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线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新...
死锁问题,java多线程死锁
Java线程Java线程Java线程Java线程Java线程Java线程