黑马程序员技术交流社区

标题: class MyLock [打印本页]

作者: 孙铭泽    时间: 2012-8-18 22:03
标题: class MyLock
class MyLock
{
    public static Object myLockA = new Object();
    public static Object myLockB = new Object();
}
class DieLock implements Runnable
{
    private boolean flag = false;
    public void run()
    {
        if(flag)
        {
            synchronized(MyLock.myLockA)
            {
                sop("if lockA");
                synchronized(MyLock.myLockB)
                {
                    sop("if lockB")
                    
                }
            }
        }
        else
        {
            synchronized(MyLock.myLockB)
            {
                sop("if lockB");
                synchronized(MyLock.myLockA)
                {
                    sop("if lockA")
                }
            }
        }
    }
}




同学们这是看的一个死锁问题,但是他们之间怎么形成死锁的。求讲解一下

作者: 杨彪    时间: 2012-8-18 22:13
有两个锁,在A锁中,使用B锁。在B锁中使用A锁,互相等待,就会造成死锁问题


作者: 周世阳    时间: 2012-8-18 22:26
如果有两个线程,线程1和线程2,线程1进入到
if(flag)
        {
            synchronized(MyLock.myLockA)
            {
                sop("if lockA");
                synchronized(MyLock.myLockB)
                {
                    sop("if lockB")
                    
                }
            }
        }
这段代码中的sop("if lockA");这里,这时候线程A拥有A锁,然后被剥夺了执行权,执行权交给了线程2
线程2开始执行,执行到
else
        {
            synchronized(MyLock.myLockB)
            {
                sop("if lockB");
                synchronized(MyLock.myLockA)
                {
                    sop("if lockA")
                }
            }
        }
这段代码中的  sop("if lockB");,这时候线程2拥有B锁,现在这个时候线程1需要B锁才能执行下去,但是B锁在线程2手里,线程2需要A锁才能继续执行,但是A锁在线程1的手里,他们就会无限的等待下去,形成死锁
作者: 周世阳    时间: 2012-8-18 22:26
如果有两个线程,线程1和线程2,线程1进入到
if(flag)
        {
            synchronized(MyLock.myLockA)
            {
                sop("if lockA");
                synchronized(MyLock.myLockB)
                {
                    sop("if lockB")
                    
                }
            }
        }
这段代码中的sop("if lockA");这里,这时候线程A拥有A锁,然后被剥夺了执行权,执行权交给了线程2
线程2开始执行,执行到
else
        {
            synchronized(MyLock.myLockB)
            {
                sop("if lockB");
                synchronized(MyLock.myLockA)
                {
                    sop("if lockA")
                }
            }
        }
这段代码中的  sop("if lockB");,这时候线程2拥有B锁,现在这个时候线程1需要B锁才能执行下去,但是B锁在线程2手里,线程2需要A锁才能继续执行,但是A锁在线程1的手里,他们就会无限的等待下去,形成死锁
作者: 方志亮    时间: 2012-8-18 22:28
当线程进来的时候走的是else  使用了b锁  然后输出if lockB  继续往下走 进入a锁 输出if lockA   同时另一个线程从a锁进 输出if lockA 继续往下走进入b锁  输出if lockB   这个时候  一个线程要用a锁  一个线程要用b锁   这两个锁同时为锁定状态  所以无法再进入 两个互相等待 导致成了死锁
作者: 灵感    时间: 2012-8-18 23:02
class MyLock
{
    public static Object myLockA = new Object();//定义两个线程
    public static Object myLockB = new Object();
}
class DieLock implements Runnable
{
    private boolean flag = false;
    public void run()
    {
        if(flag)//线程1进来了
        {
            synchronized(MyLock.myLockA)//线程1拿到A锁,but此时执行权被系统给了线程2,此时线程1拿着A锁等线程2那哥们上来呢
            {
                sop("if lockA");
                synchronized(MyLock.myLockB)//(最后看这里)线程1需要找到B锁才能继续执行,B锁在线程2那哥们那,怎么办呢?耗着吧..............
                {
                    sop("if lockB")
                    
                }
            }
        }
        else
        {
            synchronized(MyLock.myLockB)//线程2拿到执行权,很得意的进来了哦,它拿到了B锁往下走
            {
                sop("if lockB");
                synchronized(MyLock.myLockA)// 线程2找A锁,butA锁呢?A锁在线程1那呢,怎么办?耗着吧.........
                {
                    sop("if lockA")
                }
            }
        }
    }
}
感觉像警察跟土匪拿着枪对峙,谁也不愿意先放下手里的枪,但是谁也不开枪,咋弄?耗着呗..........死锁






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