黑马程序员技术交流社区

标题: 同步 死锁 [打印本页]

作者: 宋蓬勃    时间: 2013-2-24 21:43
标题: 同步 死锁
为什么会锁住呢?
假如 t1 先运行,为什么他不能拿到MyLock.locka   MyLock.lockb两个锁
class Test implements Runnable
{
        private boolean flag;
        Test(boolean flag)
        {
                this.flag = flag;
        }

        public void run()
        {
                if(flag)
                {
                        while(true)
                        {
                                synchronized(MyLock.locka)
                                {
                                        System.out.println(Thread.currentThread().getName()+"...if locka ");
                                        synchronized(MyLock.lockb)
                                        {
                                                System.out.println(Thread.currentThread().getName()+"..if lockb");                                       
                                        }
                                }
                        }
                }
                else
                {
                        while(true)
                        {
                                synchronized(MyLock.lockb)
                                {
                                        System.out.println(Thread.currentThread().getName()+"..else lockb");
                                        synchronized(MyLock.locka)
                                        {
                                                System.out.println(Thread.currentThread().getName()+".....else locka");
                                        }
                                }
                        }
                }
        }
}


class MyLock
{
        static Object locka = new Object();
        static Object lockb = new Object();
}

class  DeadLockTest
{
        public static void main(String[] args)
        {
                Thread t1 = new Thread(new Test(true));
                Thread t2 = new Thread(new Test(false));
                t1.start();
                t2.start();
        }
}

作者: 偏執旳、靑春    时间: 2013-2-24 21:57
假设t1先运行,t1运行到System.out.println(Thread.currentThread().getName()+"...if locka ");时。
t2又运行了,t2运行System.out.println(Thread.currentThread().getName()+"..else lockb");
因为t1没运行完,那么MyLock.locka无法释放,刚好t2需要他t2就不动了在等他,但是t1需要MyLock.lockb才能继续走,
而t2又不能给,所以二者相持不下,导致了死锁。
一直在里面等着,彼此看谁先动
作者: 宋蓬勃    时间: 2013-2-24 22:12
偏執旳、靑春 发表于 2013-2-24 21:57
假设t1先运行,t1运行到System.out.println(Thread.currentThread().getName()+"...if locka ");时。
t2又 ...

但是试了很多次,怎么每次都直接锁住?
作者: 偏執旳、靑春    时间: 2013-2-24 22:23
宋蓬勃 发表于 2013-2-24 22:12
但是试了很多次,怎么每次都直接锁住?

直接锁住正常啊!你想获得什么效果?
作者: 付玉光    时间: 2013-2-24 22:56

哥们你同步中嵌套了同步,但锁不同,因锁不同,健在的两线程在运行时,就都会产生等待拿另一个锁,而又死不肯放自己锁的情况,所以牛郎和织女就都只能干等待了,嗯哼?
作者: 谢洋    时间: 2013-2-25 01:35
//这里是有产生了两个独立的Test对象
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
相当于:
Test ts1 = new Test(true);
Test ts2 = new Test(false)
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);

所以说内存中同时运行着两份这样的代码,
也就是说t1执行的代码的flag一直为ture,t2执行的代码的flag一直为false,他们互相独立,
但他们同时都抢着使用locka和lockb这两把锁
两个人同时去抢这两把锁会发生什么后果?
作者: 宋蓬勃    时间: 2013-2-25 12:06
谢洋 发表于 2013-2-25 01:35
//这里是有产生了两个独立的Test对象
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(ne ...

我只是纳闷为什么一个进程抢不到两把锁呢?

我知道会出现锁死的情况,但是试了很多次都直接锁死了




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