Dev@Free

zJun's Tech Weblog

Java 多线程中的死锁问题

Java中的多线程使用 synchronized关键字实现同步.为了避免线程中使用共享资源的冲突,当线程进入 synchronized的共享对象时,将为共享对象加上锁,阻止其他的线程进入该共享对象.但是,正因为这样,当多线程访问多个共享对象时,如果线程锁定对象的顺序处理不当话就有可能线程间相互等待的情况,即常说的: 死锁现象.

比如下面演示了一个典型的死锁的情况:

线程:MyThread
/**
 * 共享线程
 *
*/

Class MyThread 
extends  Thread {
  
private
 String threadName;
  
private
 String shareObj1,shareObj2;
  
public  MyThread(String name,String shareObj1,String shareObj2)
{
    
this .threadName  =
 name;
    
this .shareObj1  =
 shareObj1;
    
this .shareObj2  =
 shareObj2;
    start();
  }

  
public  run() {
    
synchronized (shareObj1)
{
      System.out.println(threadName 
+   " locked for shareObj1 "
);
    }

    Thread.sleep(
1000 );
    
synchronized (shareObj1)
{
      System.out.println(threadName 
+   " locked for shareObj2 "
);
    }


  }

}

主程序:Main
public   class  Main {
  
private  String shareObj1  =   " share object 1 "
;
  
private  String shareObj2  =   " share object 2 "
;
  
public   static  main(String[] args)
{
    MyThread thread1 
=   new  MyThread( " thread1 "
,shareObj1,shareObj2);
    Thread.sleep(
1000
);
    MyThread thread2 
=   new  MyThread( " thread2 "
,shareObj1,shareObj2);
  }

}

运行结果:

posted on 2007-07-24 19:02 zJun's帛罗阁 阅读(3217) 评论(1)  编辑  收藏 所属分类: Java基础

评论

# re: Java 多线程中的死锁问题 2011-06-27 17:00 vistor

synchronized (shareObj1) {
System.out.println(threadName + " locked for shareObj1 " );
}
Thread.sleep( 1000 );
synchronized (shareObj1) {
System.out.println(threadName + " locked for shareObj2 " );
}
代码错了吧!这会死锁吗?
第二个是2并且new 2时顺序颠倒  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

常用链接

留言簿(15)

随笔分类

随笔档案

相册

收藏夹

博客

文档

站点

论坛

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜