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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏冬 中级黑马   /  2012-12-12 21:44  /  1469 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class deadTest implements Runnable{
        private int num=100;
        boolean fag=true;
        Object obj=new Object();
        public void run(){
                if(fag){
                while(true){
                        synchronized(obj){
                        show();
                                }
                        }
                }else{
                        while(true){
                                show();
                        }
                }
        }
        public synchronized void show(){
                synchronized(obj){
                if(num>0){
                        try{Thread.sleep(10);}catch(Exception e){}
        System.out.println(Thread.currentThread().getName()+"...."+num--);
                                }
                }
        }
}
public class 同步死锁 {
        public static void main(String[] args){
                deadTest d=new deadTest();
                Thread t=new Thread(d);
                Thread t1=new Thread(d);
                t.start();
                t1.start();
               
        }

}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
class deadTest implements Runnable{
        private int num=1000;
        boolean fag=true;
        Object obj=new Object();
        public void run(){
                if(fag)
                {
                        while(true)
                        {
                        synchronized(obj)
                        {
                        show();
                        }
                    }
                }
                else
                {
                        while(true)
                        {
                                show();
                        }
                }
        }
        public synchronized void show()
        {
                synchronized(obj)
                {
                        if(num>0){
                        try{Thread.sleep(10);}catch(Exception e){}
        System.out.println(Thread.currentThread().getName()+"...."+num--);
                                }
                }
        }
}
public class 同步死锁
{
        public static void main(String[] args){
                deadTest d=new deadTest();
                Thread t=new Thread(d);
                Thread t1=new Thread(d);
                t.start();
                try{Thread.sleep(10);}catch(Exception e){}
                d.fag=false;
                t1.start();
               
        }

}
在主函数中加入t.start();
                try{Thread.sleep(10);}catch(Exception e){}
                d.fag=false;
                t1.start();
这样使线程在run方法中切换线程时可以实现死锁。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
你的代码有点乱,fag至没有变过,if...else的else部分没有执行过。
要死锁必须是多个线程在没有释放自己的锁的时候想拿对方的锁。
这里说的锁更明确地说是锁上的监视器对象,你的程序中将Object obj作为监视器对象,但是两个线程中的
监视器对象是相同的(两个线程的Object obj是同一个),也就是说这里只有一个锁,两个线程抢来抢去都是同一个是不会死锁的。
虽然你把synchronized(obj)写了两边,但是里面的obj是同一个,谁拿到第一个也相当于拿到第二个。
这里你即使把两个obj换成两个也不会死锁,分析你的线程执行顺序,while(true)拿到第一个锁,进入show方法拿到第二个锁。两个锁的获得是顺序的不是并发的,换句话说拿到第一个锁的线程才有资格那第二个,该线程拿第二个锁没有人和他抢,这是不会死锁的,这基本上相当于是一个锁。
死锁很简单,让一个线程拿到锁1,等一会,第二个线程拿到锁2,等一下;两个线程再去拿对方的锁,必然会导致死锁的发生。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
焦健 发表于 2012-12-12 22:22
class deadTest implements Runnable{
        private int num=1000;
        boolean fag=true;

不行啊?这样做还是能死锁啊??
回复 使用道具 举报
罗会涛 发表于 2012-12-12 22:29
你的代码有点乱,fag至没有变过,if...else的else部分没有执行过。
要死锁必须是多个线程在没有释放自己的 ...

能把我的代码写成死锁么?
回复 使用道具 举报
魏冬 发表于 2012-12-12 23:44
不行啊?这样做还是能死锁啊??

你把我贴的全部代码复制过去试试,可以的。我试过很多次才贴的,你多试试,我弄都是数值跑过好几百才锁住。
回复 使用道具 举报
魏冬 中级黑马 2012-12-13 00:00:51
7#
焦健 发表于 2012-12-12 23:56
你把我贴的全部代码复制过去试试,可以的。我试过很多次才贴的,你多试试,我弄都是数值跑过好几百才锁住 ...

嗯。先谢谢你了。我知道为什么不能死锁了。
回复 使用道具 举报
魏冬 发表于 2012-12-12 23:46
能把我的代码写成死锁么?
  1. class deadTest implements Runnable
  2. {
  3.         private int num = 100;
  4.         boolean fag = true;
  5.         static Object obj1 = new Object();//弄出两把锁,一把锁是不能死锁的
  6.         static Object obj2 = new Object();

  7.         public void run()
  8.         {
  9.                 if (fag)
  10.                 {
  11.                         synchronized (obj1)//拿锁1,拿完等一下对方拿另外一把锁2(不用sleep用while(true)多跑一下也是一样)
  12.                         {
  13.                                 try
  14.                                 {
  15.                                         Thread.sleep(10);
  16.                                 }
  17.                                 catch (Exception e)
  18.                                 {
  19.                                 }
  20.                                 synchronized (obj2)//醒来拿锁2,对方这时候肯定拿到手了,再那肯定拿不到
  21.                                 {
  22.                                         show();
  23.                                 }
  24.                         }
  25.                 }
  26.                 else
  27.                 {
  28.                         synchronized (obj2)//拿锁2,拿完等一下对方拿另外一把锁1
  29.                         {
  30.                                 try
  31.                                 {
  32.                                         Thread.sleep(10);
  33.                                 }
  34.                                 catch (Exception e)
  35.                                 {
  36.                                 }
  37.                                 synchronized (obj1)//醒来拿锁1,对方这时候肯定拿到手了,再那肯定拿不到
  38.                                 {
  39.                                         show();
  40.                                 }
  41.                         }
  42.                 }
  43.         }

  44.         public synchronized void show()
  45.         {
  46.                 if (num > 0)
  47.                 {
  48.                         System.out.println(Thread.currentThread().getName() + "...."
  49.                                         + num--);
  50.                 }
  51.         }
  52. }

  53. public class Test
  54. {
  55.         public static void main(String[] args)
  56.         {
  57.                 deadTest d = new deadTest();
  58.                 d.fag = true;//用fag值控制两个线程开始的时候拿不同的锁
  59.                 Thread t = new Thread(d);
  60.                 d.fag = false;
  61.                 Thread t1 = new Thread(d);
  62.                 t.start();
  63.                 t1.start();

  64.         }

  65. }
复制代码
明白死锁的概念应该很好写的啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马