A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姚伟涛 中级黑马   /  2012-4-23 09:19  /  2663 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是死锁啊?会产生什么结果?怎么防止其发生啊?

8 个回复

倒序浏览
这玩意真不好解释,自己再看下视频吧,老毕讲得挺清楚的~
回复 使用道具 举报
死锁属于操作系统的概念了……其实很好理解。最经典的例子就是,You first,You first问题。一个门,两个“中国人”,都很有礼貌,走碰头了,都想过这个门,两个人都谦让对方先过,结果是,谁也过不去……。还有就是哲学家问题!说是四个哲学家坐在桌子上等着吃饭,每个人一边一根筷子,四个人四根筷子。一个人拿到两根筷子的时候才能吃。否则等待…… ,有一种情况就是,四个人,每个人都拿了一根筷子,还没有人放手。结果四个人都饿死……
所以死锁发生需要几个条件
1.循环等待
2.不可剥夺
3.资源独占
4.这个忘掉了……不好意思……想起来了。是保持申请……

程序并发的时候 就是两个以上的线程对一个数据进行访问操作的时候
为了防止双方互相影响导致错误 会让先进行的线程进行操作 后来的进行等待
先来的进行了一部分操作 但是还没有弄完的时候 对于后来的来说 这一部分就是锁定的

如果上锁上的不好的时候 两个线程都进行了部分操作 都在等待对方的操作完成 导致都进行不了 就是死锁

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
怎么防止其发生啊?无限期的占有资源,不释放控制权
回复 使用道具 举报
我觉得死锁就是两个线程在互掐,死锁的产生有四个必要条件,但不是充分条件;
但是避免死锁的产生还得避免四个必要条件:

互斥条件:系统中存在一个资源一次只能被一个进程所使用;
  ② 非抢占条件:系统中存在一个资源仅能被占有它的进程所释放,而不能被别的进程强行抢占。
  ③ 占有并等待条件:系统中存在一个进程已占有了分给它的资源,但仍然等待其他资源。
  ④ 循环等待条件:在系统中存在一个由若干进程形成的环形请求链,其中的每一个进程均占有若干种资源中的某一种,同时每个进程还要求(链上)下一个进程所占有的资源。
死锁产生的结果就是程序停止不前;就好比电脑死机一样,按键没有任何反应

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
死锁是花生在有同步块的时候 当一个线程拿到定一个线程的锁 而定一个线程哪个地1个线程的锁或当一个线程拿到了一个对象的锁还要哪个该线程的锁就发生死锁

1.class Demo{  
public static void main(String[] args) {
  Thread t1=new MyThread();
  Thread t2=new MyThread();
  t1.start();
  t2.start();
}
}
class MyThread extends Thread{
private static boolean flag=true;
String a=new String();
String b=new String();
public void run(){
  if(flag){
   flag=false;
   synchronized(a){
    try {
     Thread.sleep(1);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    synchronized(b){}
   }
  }
  synchronized(b){
   try {
    Thread.sleep(1);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   synchronized(a){}
  }
}
}
互相持有对方的锁
                    synchrownized(this){
                synchrownized(this){
                }
            }
一个线程在一个同步块中要拿2次同个对象的锁
只要避免以上两个问题就可以解决死锁的问题
synchrownized(this){
                       String s=new String();        
                          synchrownized(s){
                }
            }

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
我来说说我对死锁的理解。
打个比方,咱俩要开两扇门,你手里拿着我需要的钥匙,我手里拿着你需要的钥匙
我给你要钥匙,你说”你先给我我的钥匙,我就给你“
你给我要钥匙,我说“你先把我的钥匙给我,我就给你”
这样就造成咱俩一直僵持下去,谁都不肯先给对方钥匙,就造成了死锁。

死锁后产生的结果当然是,程序无线的等待,然后就停在那里了,然后就没然后了。

防止发生,我觉得吧,得视情况而定。我也说不清楚。

还有,顺便顶2楼,老毕视频里讲的很清楚。哈哈。


我顺便吐槽一下。我觉得,大家发帖是为了一起讨论问题的,如果只执行简单的百度+复制+粘帖+发表回复,发帖就没多大意义了。版主给技术分,是对我们回答的问题的一种肯定;同时我们自己也可以对于自己的理解更有了信心。大家都是新手,不断进步才是我们的目的。

百度对于楼主问题的回复:http://zhidao.baidu.com/question/105781202.html

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
陈苓 中级黑马 2012-4-23 14:47:04
8#
   死锁的理解:
   比如有两个人,甲乙都要吃饭。可是只有一双筷子,两个人各拿一支筷子,甲让乙把筷子给他,乙又让甲把筷子给他,两个人都互不相让,这样就两个人都吃不了饭,就卡死了,  
有的公司面试的时候会让你写一个分写一个死锁程序,可以用两种方式,
第一种:
    使用同步函数,同步代码块,然后同步代码块里面加入同步函数,同步函数总加入同步代码块,这样就可以实现死锁。
第二种:
   定义两个把锁,a锁和b锁,然后a锁里有b锁,b锁里又有a锁,这样就是实现了死锁
回复 使用道具 举报
上面举了很多的例子,那么这里我用代码的意思给你描述描述!
给你程序执行上面
举个例子 有两个方法
A()启动一个线程里面会调用B方法
B()也启动一个线程,但是里面会调用A方法

然后A方法等待B返回结果
B方法也在等待A返回结果,
这个时候和容易出现的情况就是三种情况

第一种:程序无响应
第二种:程序正常,但是该显示结果的什么也没有
第三种:就是卡死

所以我们要避免出现这种情况!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马