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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class MyLock //先创建了锁的类
{
        Object obj1 = new Object();
        Object obj2 = new Object();



class SiSuo implements Runnable//死锁程序
{
        MyLock my = new MyLock();//创建了锁的对象
        private boolean flag;
        SiSuo(boolean flag)
        {
                this.flag = flag;
        }
        public void run()
        {
                if(flag)
                {
                        while(true)
                        {       
                                synchronized(my.obj1)//对象调用
                                {
                                        System.out.println("code lock1");
                                        synchronized(my.obj2)
                                        {
                                                System.out.println("code lock2");
                                        }
                                }
                        }
                }       
                else
                {
                        while(true)
                        {       
                                synchronized(my.obj2) //和if里面的my.obj2不一样么?  
                                {
                                        System.out.println("else lock2");
                                        synchronized(my.obj1)
                                        {
                                        System.out.println("else lock1");
                                        }
                                }
                        }
                }
        }
}
按上面的程序 怎么锁不住呢  貌似不是同一个锁 怎么回事  难道if和else用的锁不一样? 这样调用有错?
如果锁类里面的Object obj1 = new Object(); 加上静态  类名调用的话 就能锁上 郁闷

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1

查看全部评分

17 个回复

倒序浏览
明显不一样啊  这都是两个对象了诶~~~一个是obj1,一个是obj2
回复 使用道具 举报
怎么两个对象呢? 我只创建了一个MyLock my = new MyLock()一个对象呀 ,后面我都是在对象调用
if先拿obj1锁  else是先拿obj2锁  然后if再拿obj2锁 应该拿不到了吧   怎么锁不一样?
回复 使用道具 举报
wodenhaowzg 发表于 2013-6-30 23:04
怎么两个对象呢? 我只创建了一个MyLock my = new MyLock()一个对象呀 ,后面我都是在对象调用
if先拿obj1 ...

Sorry!!!我看错啦。。刚刚就只看了第一个同步代码块里的参数了,我再看看。。
回复 使用道具 举报
,,这里没有问题,,看看主函数哪错了
回复 使用道具 举报
wodenhaowzg 发表于 2013-6-30 23:04
怎么两个对象呢? 我只创建了一个MyLock my = new MyLock()一个对象呀 ,后面我都是在对象调用
if先拿obj1 ...

虽然多线程学的不是特别好   但是楼主你的线程好像没有创建出来吧?就只有锁。还是没有上完整的代码啊?
回复 使用道具 举报
写一下主函数的情况       
        public static void main(String[] args)
        {

                SiSuo si = new SiSuo(); //创建了死锁的对象
                Thread t1 = new Thread(si);//建立俩线程
                Thread t2 = new Thread(si);
                t1.start();
                //try{Thread.sleep(10);}catch(Exception e){}
                boolean flag = false;
                t2.start();
         }

这样死锁对象不也是一个么,线程用的死锁对象应该都一样  那里面用的MyLock my = new MyLock();对象也应该是一个吧

真是的 毕老师这一省事  弄得这个麻烦出来 。。怎么锁就不一样
回复 使用道具 举报
呵呵 这么晚了 谢谢  陈雪琪 万琪 回答 {:soso_e100:}
回复 使用道具 举报
目测楼主的死锁对象创建的有问题,
你看看SisSuo构造器是要传参数的。是怎么编译成功了这个死锁呢?
回复 使用道具 举报
是不是你的flag的问题?
回复 使用道具 举报
你new对象的时候没有传flag参数 flag默认是false 你下面flag=false. 私有成员boolean flag = false重新赋值不合适吧。需要搞一个setFllag吗?
回复 使用道具 举报
wodenhaowzg 发表于 2013-6-30 23:26
呵呵 这么晚了 谢谢  陈雪琪 万琪 回答

哈哈  不客气  我会的就帮忙回答下咯  你弄好了记得回帖告诉我们是怎么回事啊~还有还有,以后上代码最好可以上完整的用上那个代码编辑器还是叫其他什么名字的东西,就是<>长这样的  比较方便点~~
回复 使用道具 举报
你的标记的问题,flag默认的是false,而你下面的flag的赋值根本就没有改变标记的值而且你这样写和你SiSuo里面的flag没有关系的吧,你要么就是对象来改变,要么就是在你的SiSuo类中创建一个setFlag方法来改变标记,至于你这个flag是私有的所以只好是创建setFlag方法来该表标记。还有就是你的主函数写的有问题,你的SiSuo类的创建实例对象的时候要传一个boolean类型的参数,你的类中没有无参的构造函数。安按照你的要求修改后的代码如下:
[code]public static void main(String[] args) throws Exception
回复 使用道具 举报
Just_Only 发表于 2013-7-1 00:28
你的标记的问题,flag默认的是false,而你下面的flag的赋值根本就没有改变标记的值而且你这样写和你SiSuo里 ...
  1. //主函数
  2. public static void main(String[] args) {
  3. SiSuo si = new SiSuo(false); //创建了死锁的对象
  4. Thread t1 = new Thread(si);//建立俩线程
  5. Thread t2 = new Thread(si);
  6. t1.start();
  7. try{Thread.sleep(10);}catch(Exception e){}
  8. si.setFlag(true);
  9. t2.start();

  10. class MyLock //先创建了锁的类
  11. {
  12. Object obj1 = new Object();
  13. Object obj2 = new Object();

  14. }

  15. class SiSuo implements Runnable//死锁程序
  16. {
  17. MyLock my = new MyLock();//创建了锁的对象
  18. private boolean flag;
  19. SiSuo(boolean flag)
  20. {
  21. this.flag = flag;
  22. }
  23. public void setFlag(boolean flag)
  24. {
  25. this.flag=flag;
  26. }
  27. public void run()
  28. {
  29. if(flag)
  30. {
  31. while(true)
  32. {
  33. synchronized(my.obj1)//对象调用
  34. {
  35. System.out.println("code lock1");
  36. synchronized(my.obj2)
  37. {
  38. System.out.println("code lock2");
  39. }
  40. }
  41. }
  42. }
  43. else
  44. {
  45. while(true)
  46. {
  47. synchronized(my.obj2) //和if里面的my.obj2不一样么?
  48. {
  49. System.out.println("else lock2");
  50. synchronized(my.obj1)
  51. {
  52. System.out.println("else lock1");
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }
复制代码
结果如下:

截图00.png
回复 使用道具 举报
纠结,只是想知道不加静态 代码该怎么打,怎么改都不行  头大  哪位大神可以把弄好的代码附上来  万分感激。。。
回复 使用道具 举报
wodenhaowzg 发表于 2013-7-1 00:35
纠结,只是想知道不加静态 代码该怎么打,怎么改都不行  头大  哪位大神可以把弄好的代码附上来  万分感激 ...

已经弄好了,请看上面。。。
回复 使用道具 举报
呵呵 原来是这样 真心谢谢版主大大  {:soso__17007744037159527374_2:}
真是迷糊了 建立setFlag这个我当时没想到 脑子真是乱了。。
看视频弄个构造函数 当时也没弄明白怎么传参数。现在懂了
呵呵 来论坛问问题 真来对了。 版主辛苦了哈。也非常感谢其他人的回答{:soso__9639225904283735390_5:}
看来参数传递这点有欠缺呀
回复 使用道具 举报
怎么将帖子改成已解决类型的呢? 找不到地方。。第一次发帖 呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马