线程中的死锁问题

原创 2013年12月04日 09:55:24

线程中的死锁都是发生在多个线程中的,多个线程中存在多个同步锁,这几个线程相互索取对方锁的钥匙造成的僵持局面
多个线程中的多个同步锁,先后索取对方锁的钥匙时,有时也会出现和谐的状态,如两个人吵架,相互不让,结果某一刻突然相互谅解了对方就进入和谐的状态了。


下面是一个线程死锁的例子:
例:
class RunnableImp implements Runnable
{
     boolean flag = true;
     Object obj1 = new Object();
     Object obj2 = new Object();
     public void run(){
          if(flag){
               synchronized(obj1){//第一个线程1先获得obj1对象锁,并将其锁住
                   
                         System.out.println(Thread.currentThread().getName()+"先获得obj1");
                         try{
                              Thread.sleep(1000);//先让线程1睡眠一段时间,让线程2有时间去获得obje2对象锁
                         }catch(Exception e){}
                         synchronized(obj2){//线程1醒来后,想去获得obj2锁,但是此锁已经被线程2获得并锁住了,所以需要等待线程2解开obj2锁
                              System.out.println(Thread.currentThread().getName()+"想获得obj2");
                         }
                   
               }
          }else{
               synchronized(obj2){//第二个线程2在线程1睡眠时先获得obj2对象锁,同样也将其锁住
                   
                         System.out.println(Thread.currentThread().getName()+"先获得obj2");
                         try{
                              Thread.sleep(1000);//让线程2睡眠一段时间,如果线程2先启动,就可以先让线程1先去获得obj1锁
                         }catch(Exception e){}
                         synchronized(obj1){
                              System.out.println(Thread.currentThread().getName()+"想获得obj1");
                         }
              
               }
          }
     }
}
public class TestRunnable
{
     public static void main(String[] args)
     {
          RunnableImp r = new RunnableImp();
          Thread t1 = new Thread(r,"线程1");
          Thread t2 = new Thread(r,"线程2");
          t1.start();
          try{
               Thread.sleep(100);
          }catch(Exception e){}
          r.flag = false;
          t2.start();
     }
}



死锁分析:



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员------多线程(No.2)(死锁、线程间通信、生产者消费者问题)

死锁   死锁(开发过程中要避免死锁) 同步中嵌套同步。   为了透彻了解死锁,下面写一个死锁程序: class Test implements Runnable{ private boolean ...

线程的相关知识、JAVA实现死锁、生产者消费者问题

线程有五种状态:创建、就绪、运行、阻塞、结束 isAlive:判断线程是否活着。就绪、运行、阻塞是活着,创建、结束是死了 getPriority、setPriority:设置优先级,明显的是,优先级高...

Windows下解决TerminateThread终止线程导致死锁问题

前面提到,调用TerminateThread终止线程曾导致栈变量回收出现问题,进而导致死锁。为了解决这个问题,只能等待各个子线程主动退出,由此导致资源访问的互斥问题。 为了解决这个问题,我建立了...

【JAVA 工具】jstack简单使用,定位死循环、线程阻塞、死锁等问题

转载地址:http://www.cnblogs.com/chenpi/p/5377445.html 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的js...
  • wanglha
  • wanglha
  • 2016年04月12日 15:24
  • 5568

java线程理解之死锁问题

/*  时间:2015年3月13日10:35:44  测试synchronized关键字的使用,以及死锁的理解  在java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性,每个对象都对应于一...

vc中调用TerminateThread终止线程所导致的死锁问题

程序中调用TerminateThread强制终止子线程,结果导致程序死锁。 子线程和主线程都使用了一个临界区变量。主线程创建子线程时,会调用临界区,从而对临界区加锁。子线程运行过程中也会对临界区...

java笔记:熟练掌握线程技术---基础篇之线程的协作和死锁的问题(下)

====================================================== 注:本文源代码点此下载 =============================...

深入学习理解java:高效的解决死锁问题的线程通讯方式:Semaphore 和 BlockingQueue

经典原始问题:生产者和消费者的问题,其实在实际项目中很容易遇到这样的无奈的问题,但是面对这样的问题的时候我们首先想到的就是多线程批处理,通过notify()…………的处理,但只这样的处理只能给我们贴上...

JavaSE第一百零四讲:哲学家就餐问题、死锁与使用wait及notify方法实现线程之间的相互通信

上一讲我们讲解了wait()方法和notify()方法的介绍,需要注意的是这两个方法是定义在Object类中,而不是Thread类里面。因此任何的一个对象都有这两个方法,而且这两个方法都是final类...

线程的互斥与死锁问题

线程的互斥 图中g_count是全局变量,从0开始。线程1和线程2对g_count进行++(5000次)操作。 如果线程1刚拿到g_count,被切断,然后线程2进行对g_count进行++,然后...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程中的死锁问题
举报原因:
原因补充:

(最多只允许输入30个字)