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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 南柯一梦境 中级黑马   /  2014-12-19 12:12  /  1284 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;
//死锁问题
public class Thread_sisuo {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Thread t1=new Thread(new Test_2(true));
                Thread t2=new Thread(new Test_2(false));
                //Thread t3=new Thread(new Test_2(true));
                //Thread t4=new Thread(new Test_2(false));
                t1.start();
                t2.start();
                //t3.start();
                //t4.start();
        }

}
class Test_2 implements Runnable
{
        private boolean flog;
        public Test_2(boolean flog){
                this.flog=flog;
        }
        public void run(){
                if(flog){
                        while(true)
                        {
                                synchronized(MyLock.locka)
                                {
                                        System.out.println("if locka");
                                        synchronized(MyLock.lockb)
                                        {
                                                System.out.println("if lockb");
                                        }
                                }
                        }
                }
                else
                {
                        while(true)
                        {
                                synchronized(MyLock.lockb)
                                {
                                        System.out.println("else lockb");
                                        synchronized(MyLock.locka)
                                        {
                                                System.out.println("else locka");
                                        }
                                }
                        }
                }
               
        }
}
class MyLock
{
        static Object locka=new Object();
        static Object lockb=new Object();
}
上面是跟着老毕写的代码,请各位大神给说说下面这段代码中线程进入到第一个代码块后具体做了什么行不?这里真心不懂。(最重要的是怎么判断锁的)
synchronized(MyLock.lockb)
                                {
                                        System.out.println("else lockb");
                                        synchronized(MyLock.locka)
                                        {
                                                System.out.println("else locka");
                                        }
                                }

评分

参与人数 1黑马币 +2 收起 理由
杨佳名 + 2 淡定

查看全部评分

9 个回复

倒序浏览
拿锁输出拿锁输出解锁,拿不到就阻塞。有什么问题?

这里也没什么大神,大神就不用来培训了
回复 使用道具 举报
cs8630323 发表于 2014-12-19 12:43
拿锁输出拿锁输出解锁,拿不到就阻塞。有什么问题?

这里也没什么大神,大神就不用来培训了 ...

比自己强的就是大神,比自己弱的但是有的地方比自己知道的多的也是大神,我眼里人人都是大神,或者大神经病。
回复 使用道具 举报 1 0
cs8630323 发表于 2014-12-19 12:43
拿锁输出拿锁输出解锁,拿不到就阻塞。有什么问题?

这里也没什么大神,大神就不用来培训了 ...

我也知道拿锁输出拿锁输出,问题是第二次拿锁时,是怎么判断锁的,这让我很困惑
回复 使用道具 举报
你把代码发出来的话别直接粘贴复制格式都不对也看不清楚,使用代码框粘贴出来懂吗
回复 使用道具 举报
而且知识这东西,你会了感觉很简单,可是我不会的呢?这就是天书啊。
回复 使用道具 举报
就一个线程能拿多个锁
回复 使用道具 举报
duluhua 中级黑马 2014-12-19 14:32:03
8#

1.同步代码块,如果多个同步代码块的()都是同一个对象,那么这些同步代码块是同一把锁。
2.同步代码块后()内如果对象不同,那么有几个 不同的对象就是几个不同的锁。
3.死锁的先决条件之一就是同步代码块()跟的对象是不同的。MyLock.locka和MyLock.lockb是不同的对象。
4.再看这段代码
synchronized(MyLock.lockb)//我需要拿到对象MyLock.lockb才能执行{}里的内容
                                {
                                        System.out.println("else lockb");
                                        synchronized(MyLock.locka)//我需要拿到MyLock.locka才能执行{}里的内容
                                        {
                                                System.out.println("else locka");
                                        }
                                }
也就是说,要先拿到b,然后再拿到a
---------------------------------
而代码
synchronized(MyLock.locka)//我需要拿到MyLock.locka才能执行{}里的内容
                                {
                                        System.out.println("if locka");
                                        synchronized(MyLock.lockb)//我需要拿到对象MyLock.lockb才能执行{}里的内容
                                        {
                                                System.out.println("if lockb");
                                        }
                                }
这里的话要先拿到a,再拿到b

------------死锁应该可以这么理解,互为先决条件,对峙起来不动了,也就锁住了。
打个比喻:
小明拿着一个苹果,小红拿着一个梨
小明对小红说:你先把梨给我,我就把苹果给你
小红对小明说:你先把苹果给我,我就把梨给你
二人互不想让
结果二人就这么僵持住了,也就是死锁了

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
wangcongwu 发表于 2014-12-19 12:50
你把代码发出来的话别直接粘贴复制格式都不对也看不清楚,使用代码框粘贴出来懂吗 ...

谢谢提醒,会注意的
回复 使用道具 举报
duluhua 发表于 2014-12-19 14:32
1.同步代码块,如果多个同步代码块的()都是同一个对象,那么这些同步代码块是同一把锁。
2.同步代码块后 ...

真的很感谢,今天又看了视频,然后查了资料,再看看你说的恍然大悟啊,谢谢啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马