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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋蓬勃 初级黑马   /  2013-2-24 21:43  /  1719 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么会锁住呢?
假如 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();
        }
}

6 个回复

倒序浏览
假设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 21:57
假设t1先运行,t1运行到System.out.println(Thread.currentThread().getName()+"...if locka ");时。
t2又 ...

但是试了很多次,怎么每次都直接锁住?
回复 使用道具 举报
宋蓬勃 发表于 2013-2-24 22:12
但是试了很多次,怎么每次都直接锁住?

直接锁住正常啊!你想获得什么效果?
回复 使用道具 举报

哥们你同步中嵌套了同步,但锁不同,因锁不同,健在的两线程在运行时,就都会产生等待拿另一个锁,而又死不肯放自己锁的情况,所以牛郎和织女就都只能干等待了,嗯哼?
回复 使用道具 举报
//这里是有产生了两个独立的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 01:35
//这里是有产生了两个独立的Test对象
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(ne ...

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

我知道会出现锁死的情况,但是试了很多次都直接锁死了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马