黑马程序员技术交流社区

标题: 跪解一个多线程方面的,关于死锁程序的一个问题 迷糊。。 [打印本页]

作者: wodenhaowzg    时间: 2013-6-30 22:55
标题: 跪解一个多线程方面的,关于死锁程序的一个问题 迷糊。。
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(); 加上静态  类名调用的话 就能锁上 郁闷

作者: 陈雪琪    时间: 2013-6-30 22:57
明显不一样啊  这都是两个对象了诶~~~一个是obj1,一个是obj2
作者: wodenhaowzg    时间: 2013-6-30 23:04
怎么两个对象呢? 我只创建了一个MyLock my = new MyLock()一个对象呀 ,后面我都是在对象调用
if先拿obj1锁  else是先拿obj2锁  然后if再拿obj2锁 应该拿不到了吧   怎么锁不一样?
作者: 陈雪琪    时间: 2013-6-30 23:15
wodenhaowzg 发表于 2013-6-30 23:04
怎么两个对象呢? 我只创建了一个MyLock my = new MyLock()一个对象呀 ,后面我都是在对象调用
if先拿obj1 ...

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

虽然多线程学的不是特别好   但是楼主你的线程好像没有创建出来吧?就只有锁。还是没有上完整的代码啊?
作者: wodenhaowzg    时间: 2013-6-30 23:22
写一下主函数的情况       
        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();对象也应该是一个吧

真是的 毕老师这一省事  弄得这个麻烦出来 。。怎么锁就不一样

作者: wodenhaowzg    时间: 2013-6-30 23:26
呵呵 这么晚了 谢谢  陈雪琪 万琪 回答 {:soso_e100:}
作者: 陈雪琪    时间: 2013-6-30 23:28
目测楼主的死锁对象创建的有问题,
你看看SisSuo构造器是要传参数的。是怎么编译成功了这个死锁呢?
作者: 王靖远    时间: 2013-6-30 23:28
是不是你的flag的问题?
作者: 王靖远    时间: 2013-6-30 23:30
你new对象的时候没有传flag参数 flag默认是false 你下面flag=false. 私有成员boolean flag = false重新赋值不合适吧。需要搞一个setFllag吗?
作者: 陈雪琪    时间: 2013-6-30 23:34
wodenhaowzg 发表于 2013-6-30 23:26
呵呵 这么晚了 谢谢  陈雪琪 万琪 回答

哈哈  不客气  我会的就帮忙回答下咯  你弄好了记得回帖告诉我们是怎么回事啊~还有还有,以后上代码最好可以上完整的用上那个代码编辑器还是叫其他什么名字的东西,就是<>长这样的  比较方便点~~
作者: Just_Only    时间: 2013-7-1 00:28
你的标记的问题,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:34
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 (7.82 KB, 下载次数: 0)

截图00.png

作者: wodenhaowzg    时间: 2013-7-1 00:35
纠结,只是想知道不加静态 代码该怎么打,怎么改都不行  头大  哪位大神可以把弄好的代码附上来  万分感激。。。
作者: Just_Only    时间: 2013-7-1 00:40
wodenhaowzg 发表于 2013-7-1 00:35
纠结,只是想知道不加静态 代码该怎么打,怎么改都不行  头大  哪位大神可以把弄好的代码附上来  万分感激 ...

已经弄好了,请看上面。。。
作者: wodenhaowzg    时间: 2013-7-1 08:29
呵呵 原来是这样 真心谢谢版主大大  {:soso__17007744037159527374_2:}
真是迷糊了 建立setFlag这个我当时没想到 脑子真是乱了。。
看视频弄个构造函数 当时也没弄明白怎么传参数。现在懂了
呵呵 来论坛问问题 真来对了。 版主辛苦了哈。也非常感谢其他人的回答{:soso__9639225904283735390_5:}
看来参数传递这点有欠缺呀
作者: wodenhaowzg    时间: 2013-7-1 08:33
怎么将帖子改成已解决类型的呢? 找不到地方。。第一次发帖 呵呵




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