黑马程序员技术交流社区

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

作者: 浪无痕-陈文坤    时间: 2013-8-5 09:39
标题: 关于死锁问题
本帖最后由 浪无痕-陈文坤 于 2013-8-5 15:12 编辑

class Lockt implements Runnable
{
  
    private boolean flag;
    public Lockt(boolean flag)
    {
        this.flag = flag;
    }
  
    public void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(PackAB.a)
                {
                        System.out.println("A+++++");
                        synchronized(PackAB.b)
                        {   
                                System.out.println("A-----:" );
                        }
                }
            }
        }
        else{
            while(true)
            {
                synchronized(PackAB.b)
                {
                        System.out.println("B+++++");
                        synchronized(PackAB.a)
                        {  
                                System.out.println("B-----:");
                        }
                }
            }

        }
    }
}

class PackAB
{
     static Object a = new Object();
     static Object b = new Object();
}
public class Hello
{
    public static void main(String args[])
    {
        
         Thread a = new Thread(new Lockt(true));
          Thread b = new Thread(new Lockt(false));
         a.start();
         b.start();
    }
}
结果:B+++++
         B-----:

        B+++++
        A+++++
红色部分是怎么回事,是cpu多核原因,还是什么?
还有cmd命令下运行死锁之后卡在那里,怎么回到cmd上,谢谢



作者: xwf4348    时间: 2013-8-5 09:55
死锁只是一个存在的问题,不一定就会出现。CPU高速切换,有可能出现AB两个锁刚刚好都获得钥匙的临界情况,那种情况下就不会出现死锁。
简而言之就是死锁存在,但是死锁不是必然发生
作者: 薛淑凯    时间: 2013-8-5 09:57
ctrl+c结束
作者: 浪无痕-陈文坤    时间: 2013-8-5 10:00
薛淑凯 发表于 2013-8-5 09:57
ctrl+c结束

谢谢!!!
作者: 浪无痕-陈文坤    时间: 2013-8-5 10:01
xwf4348 发表于 2013-8-5 09:55
死锁只是一个存在的问题,不一定就会出现。CPU高速切换,有可能出现AB两个锁刚刚好都获得钥匙的临界情况, ...

谢谢!!!
作者: 心灵之歌    时间: 2013-8-5 10:01
ctrl+c结束!
作者: 浪无痕-陈文坤    时间: 2013-8-5 10:22
心灵之歌 发表于 2013-8-5 10:01
ctrl+c结束!

谢谢!!!

作者: wang100753    时间: 2013-8-5 10:36
何为死锁 :“这里指的是进程 死锁,是一个计算机技术的名词。它是操作系统 或软件运行的一种状态:在多工系统下,当一个或多个进程等待系统资源,而系统资源又同时被此进程本身或者其 它进程占用,就形成了死锁。”

例如,线程1锁住了资源A,并试图去访问资源B,而此时线程2锁住了资源B,并试图访问资源A,这样线程1和2均锁住了对方需要的资源,并且都在等待对方持有的资源释放后才能继续运行释放自己持有的资源,死锁发生了,两个线程都因为等待资源被阻塞,假如没有一种手段来解除这种互相等待,可以想象,在理论上二者都会永远等待下去。
这种现象可以这样说明:

Thread 1 locks A,waits for B
Thread 2 locks B,wats for A

作者: binghaiwang    时间: 2013-8-5 11:37
红色部分的原因: 多线程运行 是随机的,取决于CPU的喜好,所以你的4种打印都会出现,多运行几次就知道了

其次cmd命令 使用ctrl+c即可,如果是其他工具编译那么使用相应的停止即可。
作者: 草帽    时间: 2013-8-5 11:40
在楼主的代码中有三个线程(包括主线程),先执行那一个是不一定的。
象楼主这样的情况,是执行到主线程末尾(没有结束),就分配到 b 上开始执行,并执行一会儿,所以先打印出B+++++     B-----:     B+++++(PackAB.a锁释放,PackAB.b锁还没有释放),这时转移到进行 a 线程,并打印A+++++(没有释放PackAB.a锁),但是在向下进行时由于 b 占有PackAB.b不能向下,而b在向下时需要PackAB.a锁却得不到,所以产生互锁。
推出Ctrl + c就好,默认填入一个结束标记。
作者: 浪无痕-陈文坤    时间: 2013-8-5 15:09
草帽 发表于 2013-8-5 11:40
在楼主的代码中有三个线程(包括主线程),先执行那一个是不一定的。
象楼主这样的情况,是执行到主线程末 ...

谢谢!!!
作者: 浪无痕-陈文坤    时间: 2013-8-5 15:12
wang100753 发表于 2013-8-5 10:36
何为死锁 :“这里指的是进程 死锁,是一个计算机技术的名词。它是操作系统 或软件运行的一种状态:在多工 ...

谢啦!!!
作者: 浪无痕-陈文坤    时间: 2013-8-5 15:13
binghaiwang 发表于 2013-8-5 11:37
红色部分的原因: 多线程运行 是随机的,取决于CPU的喜好,所以你的4种打印都会出现,多运行几次就知道了

...

谢谢!!!




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