线程中的死锁问题

原创 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();
     }
}



死锁分析:



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

多线程死锁及解决办法

死锁是由于不同线程按照不同顺序进行加锁而造成的。如: 线程A:对lock a加锁 => 对lock b加锁 => dosth => 释放lock b => 释放lock a 线程B:对...
  • zgaoq
  • zgaoq
  • 2017年05月18日 17:22
  • 985

logback多线程下死锁问题

logback 多线程下频繁的写日志会出现死锁,可以使用异步appender避免这个问题: ${LOG_HOME}/userprofilemodel.log ...
  • yang292292
  • yang292292
  • 2016年07月04日 11:33
  • 1665

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

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

MFC多线程编程的几点经验 (防止死锁)

1) 不要在线程函数体内操作MFC控件,不要再线程里面调用UpdateData函数更新用户界面,而应该尽量采用发送消息的方式,在主线程的消息响应函数中操作控件; 2)不建议采用SendMessage...
  • fishhg
  • fishhg
  • 2011年08月23日 12:28
  • 967

多线程的五种常见死锁问题 (看看你能答对几个)

多线程的死锁问题(五个常见实例教你完全理解死锁问题) 环境信息: Mac OS X 10.10.5 Xcode 6.2 iOS 8.2 死锁一直都是在使用多线...
  • heartFlyings
  • heartFlyings
  • 2015年09月28日 18:19
  • 429

如何解决多线程程序中的死锁问题(转)

如何解决多线程程序中的死锁问题     经常在技术论坛上看到有人虎目含泪地向人哭诉被多线程程序中的死锁问题搞得欲死欲仙,最后扔下狠话:再不用多线程了,要用多进程。     的确,死锁问题是一个...
  • zmjingying
  • zmjingying
  • 2011年09月18日 09:47
  • 8124

线程概念及死锁的理解

1.什么是进程(Process)和线程(Thread)?有何区别? 进程是一个程序运行占用内存空间。线程是程序的一代码段。一个或多个线程组成一个进程。进程可以执行多个任务,每个任务都是...
  • chdyiboke
  • chdyiboke
  • 2016年05月16日 10:18
  • 1077

Linux多线程如何避免死锁

1、线程死锁产生的必要条件:(1)互斥条件:一个资源每次只能被一个进程使用。 (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3)不可剥夺条件:进程已获得的资源,...
  • u010889616
  • u010889616
  • 2015年08月23日 23:09
  • 957

JAVA线程之七:线程的生命周期及死锁

一,线程的四个主要周期状态是“创建”,“可执行”,“非可执行”,“消亡”,状态转换关系如下图:(1)创建。当实例化一个thread对象并执行start()方法后,线程进入“可执行”状态开始执行。虽然多...
  • zhandoushi1982
  • zhandoushi1982
  • 2010年04月19日 17:13
  • 3985

线程饥饿死锁

线程饥饿死锁:       在一个线程池中,如果一个任务依赖于其他任务的执行,就可能产生死锁。对应一个单线程话的Executor,一个任务将另一个任务提交到相同的Executor中,并等待新提交...
  • w1014074794
  • w1014074794
  • 2016年04月10日 09:39
  • 2061
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程中的死锁问题
举报原因:
原因补充:

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