ITPUB论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5904|回复: 8

[精华] 帮忙!! 一道关于线程死锁的题 [复制链接]

注册会员

中级会员

精华贴数
1
技术积分
865
社区积分
0
注册时间
2006-4-19
论坛徽章:
2
2009新春纪念徽章
日期:2009-01-04 14:52:28开发板块每日发贴之星
日期:2011-01-21 01:01:01
发表于 2006-4-19 23:40:54 |显示全部楼层
package untitled1;

public class Application1{
   
    public static void main(String[] as){
        final StringBuffer s1 = new StringBuffer();
        final StringBuffer s2 = new StringBuffer();
        
        new Thread(){
            public void run(){
                synchronized(s1){
                   s2.append("A";
                   synchronized(s2){
                       s2.append("B";
                       System.out.print(s1);
                       System.out.print(s2);
                   }
                }
            }
        }.start();
        
        new Thread(){
            public void run(){
                synchronized(s2){
                    s2.append("C";
                    synchronized(s1){
                        s1.append("D";
                        System.out.print(s2);
                        System.out.print(s1);
                    }
                }
            }
        }.start();
        
    }
   
}

输出:ABABCD

Which two statements are true? (Choose Two)   

A. The program prints "ABBCAD"

B. The program prints "CDDACB"

C. The program prints "ADCBADBC"

D. The output is a non-deterministic point because of a possible deadlock condition.

E. The output is dependent on the threading model of the system the program is running on.   

Answer: D, E

这道有点晕,请各位帮忙讲一下这道题

版主

冥王星酋长

精华贴数
0
技术积分
36245
社区积分
15222
注册时间
2003-12-19
论坛徽章:
153
现任管理团队成员
日期:2011-05-07 01:45:08迷宫蛋
日期:2012-04-28 15:03:47版主3段
日期:2012-05-15 15:24:11
发表于 2006-4-20 07:56:20 |显示全部楼层
看看deadlock的定义

使用道具 举报

注册会员

中级会员

精华贴数
1
技术积分
865
社区积分
0
注册时间
2006-4-19
论坛徽章:
2
2009新春纪念徽章
日期:2009-01-04 14:52:28开发板块每日发贴之星
日期:2011-01-21 01:01:01
发表于 2006-4-20 08:22:55 |显示全部楼层
deadlock/死锁
在操作系统或数据库中,两个或多个进程受制无法继续而每个都在等待由另一个继续所释放的资源的情况。

讲详细一点可以吗


Thread1
synchronized(a){
synchronized(b){
}
}
Thread2
synchronized(b){synchronized(a){
}
}
都start();问结果,结果是 可能deadlock,就是大家很常见的那道题
a,b是StringBuffer();Thread1,2是用
new Thread(){
public void run(){
//....
}
}.start();
方式定义

为什么会出现deadlock,不是已经输出了吗?
--------------------------------------------------------------------------------------------------------------------
     我很菜,但我很好学,大家帮帮忙

使用道具 举报

版主

肥猫猫

精华贴数
11
技术积分
10976
社区积分
11743
注册时间
2002-12-15
论坛徽章:
50
生肖徽章:猪
日期:2006-09-07 17:08:56ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010广州亚运会纪念徽章:藤球
日期:2010-10-22 12:53:592011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:33管理团队成员
日期:2011-05-07 01:45:08灰彻蛋
日期:2011-10-28 14:15:35ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
发表于 2006-4-20 09:20:28 |显示全部楼层
[php]
package untitled1;

public class Application1{

public static void main(String[] as){
final StringBuffer s1 = new StringBuffer();
final StringBuffer s2 = new StringBuffer();

    new Thread(){//线程1
        public void run(){
            synchronized(s1){ //线程1:S1锁定
                s2.append("A";
                synchronized(s2){//线程1:S2锁定
                    s2.append("B";
                    System.out.print(s1);
                    System.out.print(s2);
                }//线程1 终点
            }
        }
    }.start();

    new Thread(){//线程2
        public void run(){
            synchronized(s2){ //线程2:S2锁定
                s2.append("C";
                synchronized(s1){//线程2:S1锁定
                    s1.append("D";
                    System.out.print(s2);
                    System.out.print(s1);
                }//线程2 终点
            }
        }
    }.start();

}

}
[/php]
所谓DEADLOCK就是指出现"线程1"无法执行到"线程1 终点"或者"线程2"无法执行到"线程2 终点"的情况
证明:

假设"线程1"无法执行到"线程1 终点"
因此有, "线程1"在"线程1:S1锁定"或者"线程1:S2锁定"处

假定1, "线程1"在"线程1:S1锁定"处
则,
A. "线程2"得到了S1
B. "线程2"在"线程2:S1锁定"和"线程2 终点"之间,
因为, 程序块中没有任何锁定操作, "线程2"一定能够执行到"线程2 终点", 释放S1从而"线程1"可以续行,
假定1不能成立.

假定2, "线程1"在"线程1:S2锁定"处
则,
A. "线程1"得到了S1.
B. "线程2"得到了S2
C. "线程2" 在"线程2:S2锁定"和"线程2 终点"之间,
此时, "线程2"因无法得到S1将停止于"线程2:S1锁定"
假定2成立

上述程序出现DEADLOCK

使用道具 举报

注册会员

中级会员

精华贴数
1
技术积分
865
社区积分
0
注册时间
2006-4-19
论坛徽章:
2
2009新春纪念徽章
日期:2009-01-04 14:52:28开发板块每日发贴之星
日期:2011-01-21 01:01:01
发表于 2006-4-20 09:54:22 |显示全部楼层
向:肥猫猫 致敬 谢谢

使用道具 举报

注册会员

初级会员

精华贴数
0
技术积分
6
社区积分
0
注册时间
2006-5-19
论坛徽章:
0
发表于 2006-6-6 04:05:31 |显示全部楼层

死锁的理解

在计算机多道程序系统中,一组进程中的每一个进程均无限期的等待另一组进程所占有的且不会释放的资源,这种现象称为死锁
例如,
进程1,2分别完全占有两种系统资源A和B,它们的进程操作分别如下(从左到右):
1:获得A资源,获得B资源,释放A资源,释放B资源;
2:获得B资源,获得A资源,释放B资源,释放A资源;
从1来看,它要获得B资源才会释放A资源,而获得A资源正是进程2释放B资源的条件,所以两个进程互相等待,进入死锁.

    看似枯燥抽象的概念其实是可以从现实生活中体会到的,厕所便是获得这种体会的宝地!以下便是在下今天的新收获:

    窗外风和日丽,终于告别了多日的阴雨天气,所以做什么时候都非常爽,包括如厕.(先说明一下:经常在上课时间,我会在宿舍,为了保证宿舍安全,上厕所的时候我都会关好门窗,看得出我是个爱宿舍的人~0~)新陈代谢活动正进行着如火如荼的时候,突然舍长敲门了(这家伙不喜欢带钥匙),被打扰了,连我的肠胃都叫不爽~~~ 为了不让舍长露宿街头,只能草草了之.这时,惨痛的一幕发生了---手纸不多了...除了惊悸,在我脑海中还闪过了一个对计算机概念的理解:
    假如这个时候手纸真的不够,我需要别人给我增援,我就会一直等.同时,在外面的人,需要我去开门,他才能进来,而事实上,我是不可能去开门的,因为我在等着他来"增援".此时,都同时在等待对方的"增援",而这种"增援"都是不可能发生的,两个人处于僵持状态,"死锁"便发生了!
    (注:我顺利完成如厕的动作相当于进程1,舍长进入宿舍相当于进程2,手纸相当于资源A,门打开了相当于资源B)

     以上便是我对于"线程死锁"新的理解方式,你看明白了吗?

     PS:还好那天手纸够了,我找了藏匿的顽固分子,"死锁"最终没发生...

使用道具 举报

注册会员

中级会员

精华贴数
0
技术积分
220
社区积分
3
注册时间
2005-8-16
论坛徽章:
3
开发板块每日发贴之星
日期:2005-09-04 01:02:30授权会员
日期:2006-06-15 11:28:19开发板块每日发贴之星
日期:2006-06-16 01:02:38
发表于 2006-6-15 11:30:23 |显示全部楼层
楼上的不错,wc也在思考问题!

使用道具 举报

注册会员

蓝色

精华贴数
0
技术积分
641
社区积分
956
注册时间
2006-12-26
论坛徽章:
11
生肖徽章:狗
日期:2007-01-25 16:58:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53会员2007贡献徽章
日期:2007-09-26 18:42:10开发板块每日发贴之星
日期:2007-03-25 01:12:09开发板块每日发贴之星
日期:2007-03-24 01:13:55开发板块每日发贴之星
日期:2007-03-18 01:09:34生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
发表于 2007-3-9 09:28:01 |显示全部楼层
长见识了。呵呵

使用道具 举报

注册会员

老会员

精华贴数
0
技术积分
820
社区积分
256
注册时间
2004-11-13
论坛徽章:
1
发表于 2007-3-9 13:29:21 |显示全部楼层
啊扑

使用道具 举报

相关内容推荐
您需要登录后才可以回帖 登录 | 注册

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 邮箱 虎吧 老博客 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
回顶部