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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Zoe-

中级黑马

  • 黑马币:9

  • 帖子:76

  • 精华:0

© Zoe- 中级黑马   /  2015-3-22 00:00  /  1242 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了毕老师的多线程死锁,自己也写着玩了一个,可是写出来之后发现好像哪里不对
原谅我是个0基础的渣,对葫芦画板还是不对:'(


//死锁,当有两个锁,互相嵌套时有可能会互相抢夺执行权,出现死锁现象
/*
注意:写死锁是为了避免以后出现死锁!!!!
1:定义两个锁,锁的对象为两个//如何在锁中嵌套另一个锁??????
2:两个锁的对象分别为对方的锁
*/

class Deathlock implements Runnable
{
        private boolean flag;
//定义锁
        Object obj=new Object();
        Object obje=new Object();
        Deathlock(boolean flag)
        {
                this.flag=flag;
        }
        public void run()
        {
                while(true)
                {
                        if(flag==true)
                        {
                                synchronized(obj)
                                {
                                        System.out.println(Thread.currentThread().getName()+"--obj");
                                        synchronized(obje)
                                        {
                                                System.out.println(Thread.currentThread().getName()+"---obje");
                                        }
                                }
                        }
                        else
                        {
                                synchronized(obje)
                                {
                                        System.out.println(Thread.currentThread().getName()+"---obje");
                                        synchronized(obj)
                                        {
                                                System.out.println(Thread.currentThread().getName()+"--obj");
                                        }
                                }
                       
                        }
                }
        }
}
class DeathlockDemo
{
        public static void main(String[] args)
        {
                Deathlock d=new Deathlock(true);
                Deathlock d1=new Deathlock(false);
                Thread t=new Thread(d);
                Thread t1=new Thread(d1);
                t.start();
                t1.start();
        }
}


评分

参与人数 3黑马币 +34 收起 理由
lzhuas + 20 再接再励,多想想为什么
温晓慧 + 4 恩恩
夕默 + 10 淡定

查看全部评分

11 个回复

倒序浏览
楼主,我将你的代码稍加改动,就死锁了。主要改动是将你的两个锁,提取到另一类MyLock中,然后在调用MyLock类中的两个锁


代码如下
  1. class Deathlock implements Runnable
  2. {
  3.         private boolean flag;
  4. //定义锁
  5.        // Object obj=new Object();
  6.        // Object obje=new Object();
  7.         Deathlock(boolean flag)
  8.         {
  9.                 this.flag=flag;
  10.         }
  11.         public void run()
  12.         {

  13.                         if(flag)
  14.                         {
  15.                                                          while(true)
  16.                                                          {
  17.                                 synchronized(MyLock.obj)
  18.                                 {
  19.                                         System.out.println(Thread.currentThread().getName()+"--obj");
  20.                                         synchronized(MyLock.obje)
  21.                                         {
  22.                                                 System.out.println(Thread.currentThread().getName()+"---obje");
  23.                                         }
  24.                                 }
  25.                                                          }
  26.                         }
  27.                         else
  28.                         {
  29.                                                           while(true)
  30.                                                          {
  31.                                 synchronized(MyLock.obje)
  32.                                 {
  33.                                         System.out.println(Thread.currentThread().getName()+"---obje");
  34.                                         synchronized(MyLock.obj)
  35.                                         {
  36.                                                 System.out.println(Thread.currentThread().getName()+"--obj");
  37.                                         }
  38.                                 }
  39.                                                           }
  40.                         }
  41.                
  42.         }
  43. }

  44. class MyLock
  45. {
  46.         static Object obj = new Object();
  47.         static Object obje = new Object();
  48. }


  49. class DeathlockDemo02
  50. {
  51.         public static void main(String[] args)
  52.         {
  53.                 Deathlock d=new Deathlock(true);
  54.                 Deathlock d1=new Deathlock(false);
  55.                 Thread t=new Thread(d);
  56.                 Thread t1=new Thread(d1);
  57.                 t.start();
  58.                 t1.start();
  59.         }
  60. }
复制代码





回复 使用道具 举报
哥给你分析一下原因,你写的死锁不是死是因为你用的O1,O2这两个对象都不是同一个O1,O2,也就是你在main函数里new线程的时候线程1里的O1,O2跟线程2的O1,O2不是同一个O1,O2。你只要在class Deathlock里new Object对象前加static修饰,保证唯一性,就可锁死
回复 使用道具 举报
要确保两个线程用的是相同的锁对象才会死锁,自己用自己的锁是没用的
回复 使用道具 举报
绝望 发表于 2015-3-22 09:57
要确保两个线程用的是相同的锁对象才会死锁,自己用自己的锁是没用的

:handshake谢谢
回复 使用道具 举报
lzhuas 发表于 2015-3-22 09:50
哥给你分析一下原因,你写的死锁不是死是因为你用的O1,O2这两个对象都不是同一个O1,O2,也就是你在main函 ...

好高深的样子,谢谢了
回复 使用道具 举报
Zoe- 中级黑马 2015-3-23 22:54:18
7#
coolzhou9527 发表于 2015-3-22 01:41
楼主,我将你的代码稍加改动,就死锁了。主要改动是将你的两个锁,提取到另一类MyLock中,然后在调用MyLock ...

谢谢了,会努力的:D
回复 使用道具 举报
都是大神啊
回复 使用道具 举报
来学习了
回复 使用道具 举报
Zoe- 中级黑马 2015-3-24 21:16:38
10#

我是渣来的
回复 使用道具 举报
Zoe- 中级黑马 2015-3-24 21:19:18
11#

;P共同学习
回复 使用道具 举报
Zoe- 中级黑马 2015-3-24 21:20:32
12#
coolzhou9527 发表于 2015-3-22 01:41
楼主,我将你的代码稍加改动,就死锁了。主要改动是将你的两个锁,提取到另一类MyLock中,然后在调用MyLock ...

:handshake好厉害,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马