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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 浪无痕-陈文坤 中级黑马   /  2013-8-5 09:39  /  1476 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 浪无痕-陈文坤 于 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上,谢谢


评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

12 个回复

倒序浏览
死锁只是一个存在的问题,不一定就会出现。CPU高速切换,有可能出现AB两个锁刚刚好都获得钥匙的临界情况,那种情况下就不会出现死锁。
简而言之就是死锁存在,但是死锁不是必然发生
回复 使用道具 举报
ctrl+c结束
回复 使用道具 举报

谢谢!!!
回复 使用道具 举报
xwf4348 发表于 2013-8-5 09:55
死锁只是一个存在的问题,不一定就会出现。CPU高速切换,有可能出现AB两个锁刚刚好都获得钥匙的临界情况, ...

谢谢!!!
回复 使用道具 举报
ctrl+c结束!
回复 使用道具 举报

谢谢!!!
回复 使用道具 举报
何为死锁 :“这里指的是进程 死锁,是一个计算机技术的名词。它是操作系统 或软件运行的一种状态:在多工系统下,当一个或多个进程等待系统资源,而系统资源又同时被此进程本身或者其 它进程占用,就形成了死锁。”

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

Thread 1 locks A,waits for B
Thread 2 locks B,wats for A
回复 使用道具 举报
红色部分的原因: 多线程运行 是随机的,取决于CPU的喜好,所以你的4种打印都会出现,多运行几次就知道了

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

谢谢!!!
回复 使用道具 举报
wang100753 发表于 2013-8-5 10:36
何为死锁 :“这里指的是进程 死锁,是一个计算机技术的名词。它是操作系统 或软件运行的一种状态:在多工 ...

谢啦!!!
回复 使用道具 举报
binghaiwang 发表于 2013-8-5 11:37
红色部分的原因: 多线程运行 是随机的,取决于CPU的喜好,所以你的4种打印都会出现,多运行几次就知道了

...

谢谢!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马