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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请高手写一个简单的死锁程序,并针对此程序提出几条解决方法:
程序:
写在这里。。。。。

解决方法:
1
2
3
4
    谢谢!

评分

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

查看全部评分

2 个回复

正序浏览
  1. public class RunnableTest implements Runnable {
  2.     private int flag = 1;
  3.     private Object obj1 = new Object(), obj2 = new Object();

  4.     public void run() {
  5.         System.out.println("flag=" + flag);
  6.         if (flag == 1) {
  7.             synchronized (obj1) {
  8.                 System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");   
  9.                 try {
  10.                     Thread.sleep(500);
  11.                 } catch (InterruptedException e) {
  12.                     e.printStackTrace();
  13.                 }
  14.                 synchronized (obj2) {
  15.                     System.out.println("1");
  16.                 }
  17.             }
  18.         }
  19.         if (flag == 0) {
  20.             synchronized (obj2) {
  21.                 System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");   
  22.                 try {
  23.                     Thread.sleep(500);
  24.                 } catch (InterruptedException e) {
  25.                     e.printStackTrace();
  26.                 }
  27.                 synchronized (obj1) {
  28.                     System.out.println("0");
  29.                 }
  30.             }
  31.         }
  32.     }

  33.     public static void main(String[] args) {
  34.         RunnableTest run01 = new RunnableTest();
  35.         RunnableTest run02 = new RunnableTest();
  36.         run01.flag = 1;
  37.         run02.flag = 0;
  38.         Thread thread01 = new Thread(run01);
  39.         Thread thread02 = new Thread(run02);
  40.         System.out.println("线程开始喽!");   
  41.         thread01.start();
  42.         thread02.start();
  43.     }
  44. }
复制代码


解决方法就是尽量不要在同步代码块中嵌套另一个同步代码块。

评分

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

查看全部评分

回复 使用道具 举报
  1. 03.package com.ljl.thread;  
  2. 04.public class DealLock implements Runnable {  
  3. 05.    private int flag = 1;  
  4. 06.    // 此对象必须是静态的,同步必须是被多个线程共享  
  5. 07.    static Object resource1 = new Object(), resource2 = new Object();  
  6. 08.  
  7. 09.    public void run() {  
  8. 10.        if (flag == 1) {  
  9. 11.            synchronized (resource1) {  
  10. 12.                System.out.println("resource1");  
  11. 13.                try {  
  12. 14.                    Thread.sleep(1000);  
  13. 15.                } catch (InterruptedException e) {  
  14. 16.                    // TODO Auto-generated catch block  
  15. 17.                    e.printStackTrace();  
  16. 18.                }  
  17. 19.                synchronized (resource2) {  
  18. 20.                    System.out.println("resource2");  
  19. 21.                }  
  20. 22.            }  
  21. 23.        }  
  22. 24.        if (flag == 0) {  
  23. 25.            synchronized (resource2) {  
  24. 26.                System.out.println("resource2");  
  25. 27.                try {  
  26. 28.                    Thread.sleep(1000);  
  27. 29.                } catch (InterruptedException e) {  
  28. 30.                    // TODO Auto-generated catch block  
  29. 31.                    e.printStackTrace();  
  30. 32.                }  
  31. 33.                synchronized (resource1) {  
  32. 34.                    System.out.println("resource1");  
  33. 35.                }  
  34. 36.            }  
  35. 37.        }  
  36. 38.    }  
  37. 39.  
  38. 40.    public static void main(String[] args) {  
  39. 41.        DealLock lock1 = new DealLock();  
  40. 42.        DealLock lock2 = new DealLock();  
  41. 43.        lock1.flag = 1;  
  42. 44.        lock2.flag = 0;  
  43. 45.        Thread ll1 = new Thread(lock1);  
  44. 46.        Thread ll2 = new Thread(lock2);  
  45. 47.        ll1.start();  
  46. 48.        ll2.start();  
  47. 49.    }  
  48. 50.}  
复制代码

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马