黑马程序员技术交流社区

标题: 关于死锁 [打印本页]

作者: 王晓斌    时间: 2013-1-21 08:50
标题: 关于死锁
本帖最后由 王晓斌 于 2013-1-21 09:56 编辑

看毕老师视频中,死锁是直接加了两把锁形成的,可是谁能举个生活中可能死锁的例子~~~最好再附段代码。伪代码也行
作者: 陈丽莉    时间: 2013-1-21 09:05
       嗯? 老毕的视频里也有讲到呀,比如A有一只筷子,B有一只筷子,俩人锁的机制都是等拿到两只筷子,吃下一口饭才放下手中的筷子,那两个人同时要吃东西的时候不就死锁了么~
       再举个例子,假如丈夫和妻子都要上网,家里只有一台电脑。如果丈夫是等妻子用完再用电脑,而妻子是要丈夫上他的qq,在农场偷菜之后才离开电脑,那不就死锁了么,相互等着了~
作者: 黑马张英涛    时间: 2013-1-21 09:10
老毕的筷子的例子太精辟了
作者: 陈丽莉    时间: 2013-1-21 09:15
本帖最后由 陈丽莉 于 2013-1-21 09:16 编辑

     再比如搬寝室的时候,101要等102搬完空出来,再搬进去,102等103,而103等101,大家都等着对方搬了才开始搬东西,不沟通的话不就傻等着了~
     伪代码的话我试着写下吧:
   room101()
   {
         if(102为空)
              搬进102;
   }
    room102()
    {
          if(103为空)
              搬进103;
     }
     room103()
     {
          if(101为空)
               搬进101;
     }
      这不就锁住了么~  其实很好理解的,加油~!
作者: yong230    时间: 2013-1-21 09:16
class Info {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private String name = "Rollen";
    private int age = 20;
}

/**
* 生产者
* */
class Producer implements Runnable{
    private Info info=null;
    Producer(Info info){
        this.info=info;
    }
     
    public void run(){
        boolean flag=false;
        for(int i=0;i<25;++i){
            if(flag){
                this.info.setName("Rollen");
                try{
                    Thread.sleep(100);
                }catch (Exception e) {
                    e.printStackTrace();
                }
                this.info.setAge(20);
                flag=false;
            }else{
                this.info.setName("chunGe");
                try{
                    Thread.sleep(100);
                }catch (Exception e) {
                    e.printStackTrace();
                }
                this.info.setAge(100);
                flag=true;
            }
        }
    }
}
/**
* 消费者类
* */
class Consumer implements Runnable{
    private Info info=null;
    public Consumer(Info info){
        this.info=info;
    }
     
    public void run(){
        for(int i=0;i<25;++i){
            try{
                Thread.sleep(100);
            }catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(this.info.getName()+"<---->"+this.info.getAge());
        }
    }
}

/**
* 测试类
* */
class hello{
    public static void main(String[] args) {
        Info info=new Info();
        Producer pro=new Producer(info);
        Consumer con=new Consumer(info);
        new Thread(pro).start();
        new Thread(con).start();
    }
}

运行从结果中看到,名字和年龄并没有对应,这就是线程同步的问题
作者: 王晓斌    时间: 2013-1-21 09:54
标题: RE: 关于死锁
本帖最后由 王晓斌 于 2013-1-21 09:55 编辑
陈丽莉 发表于 2013-1-21 09:15
再比如搬寝室的时候,101要等102搬完空出来,再搬进去,102等103,而103等101,大家都等着对方搬了才 ...

懂了,之前还是因为理解的不透彻,想不到别的例子!非常感谢你的回答~~~
作者: 贾文泽    时间: 2013-1-21 10:16
黑马张英涛 发表于 2013-1-21 09:10
老毕的筷子的例子太精辟了

老毕好多经典的话:lol 建议写个毕老师经典语录,,哈哈

我就只说一个字...
那必须的么...
就这么简单...
...
...
...





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2