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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 那些人之一 中级黑马   /  2013-12-8 19:24  /  1559 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 那些人之一 于 2013-12-9 09:10 编辑

问题1:两个线程,想让一个有全部两个钥匙,一个就只有一个。所以就把毕老师的死锁问题给修该了,但是看结果没有弄明白为什么会出现这个结果。求解惑。
问题2:如何实现一个有全部两个钥匙,一个就只有一个。下面代码,和结果的截图。
  1. class Test implements Runnable
  2. {
  3. private boolean flag;
  4. Test(boolean flag)
  5. {
  6. this.flag=flag;
  7. }
  8. public void run()
  9. {


  10. if(flag)
  11. {
  12. //while(true)
  13. synchronized(Mylock.locka)
  14. {
  15. System.out.println(Thread.currentThread().getName()+
  16. "if ----locka----");
  17. synchronized(Mylock.lockb)
  18. {
  19. System.out.println(Thread.currentThread().getName()+
  20. "if ----lockb----");
  21. }
  22. }
  23. }
  24. else
  25. {
  26. //while(true)
  27. synchronized(Mylock.lockb)
  28. {
  29. System.out.println(Thread.currentThread().getName()+
  30. "else ----lockb----");
  31. if(flag=true)
  32. {
  33. synchronized(Mylock.lockb)
  34. {
  35. System.out.println(Thread.currentThread().getName()+
  36. "else----lockb----");
  37. }
  38. }
  39. else
  40. {
  41. synchronized(Mylock.locka)
  42. {
  43. System.out.println(Thread.currentThread().getName()+
  44. "else----locka----");
  45. }
  46. }
  47. /*synchronized(Mylock.locka)
  48. {
  49. System.out.println(Thread.currentThread().getName()+
  50. "else----locka----");
  51. }
  52. */
  53. }
  54. }


  55. }
  56. }


  57. class Mylock
  58. {
  59. public static final Object locka=new Object();
  60. public static final Object lockb=new Object();
  61. }
  62. class Dead
  63. {
  64. public static void main(String[] args)
  65. {
  66. Test a=new Test(true);
  67. Test b=new Test(false);
  68. Thread t1=new Thread(a);
  69. Thread t2=new Thread(b);
  70. t1.start();
  71. t2.start();

  72. }
  73. }
复制代码


2 个回复

倒序浏览
问题一:
源代码:
  1. class Test implements Runnable
  2. {
  3.         private boolean flag;
  4.         Test(boolean flag)
  5.         {
  6.         this.flag=flag;
  7.         }
  8.         public void run()
  9.         {
  10.        
  11.        
  12.                 if(flag)
  13.                 {
  14.                 //while(true)   //因为将while注释掉线程只运行一次,如果能出现死锁,死锁出现的情况也非常难弄出来
  15.                         synchronized(Mylock.locka)  //获得锁 locka
  16.                         {
  17.                         System.out.println(Thread.currentThread().getName()+
  18.                         "if ----locka----");
  19.                                 synchronized(Mylock.lockb)//获得锁 lockb
  20.                                 {
  21.                                 System.out.println(Thread.currentThread().getName()+
  22.                                 "if ----lockb----");
  23.                                 }
  24.                         }
  25.                 }
  26.                 else
  27.                 {
  28.                 //while(true)//将while 注释点线程只运行一次
  29.                         synchronized(Mylock.lockb) //获得锁lockb
  30.                         {
  31.                         System.out.println(Thread.currentThread().getName()+
  32.                         "else ----lockb----");
  33.                                 if(flag=true)//因为词句为赋值语句,而值为true,所以不管运行几次都不会运行else语句。
  34.                                 {
  35.                                         synchronized(Mylock.lockb)//获得锁lockb
  36.                                         {
  37.                                         System.out.println(Thread.currentThread().getName()+
  38.                                         "else----lockb----");
  39.                                         }
  40.                                 }
  41.                                 else
  42.                                 {
  43.                                         synchronized(Mylock.locka)
  44.                                         {
  45.                                         System.out.println(Thread.currentThread().getName()+
  46.                                         "else----locka----");
  47.                                         }
  48.                                 }
  49.                         /*synchronized(Mylock.locka)
  50.                         {
  51.                         System.out.println(Thread.currentThread().getName()+
  52.                         "else----locka----");
  53.                         }
  54.                         */
  55.                         }
  56.                 }
  57.        
  58.        
  59.         }
  60. }


  61. class Mylock
  62. {
  63. public static final Object locka=new Object();
  64. public static final Object lockb=new Object();
  65. }
  66. class Dead
  67. {
  68. public static void main(String[] args)
  69. {
  70. Test a=new Test(true);
  71. Test b=new Test(false);
  72. Thread t1=new Thread(a);
  73. Thread t2=new Thread(b);
  74. t1.start();
  75. t2.start();

  76. }
  77. }
复制代码

如果t1先执行获得locka的锁,对t2没有影响,如果t1继续获得lockb 那么t2就会等待等到t1运行结束,t2在运行;如果t2获得lockb锁那么在t2运行完之前t1等待.
如果t2先获得锁lockb,对t1获得锁locka没有影响,对于t1获得锁locka对t2没有影响,但t1想获得lockb锁,要等到t2运行完;
所以不出现死锁。
所以出现的结果是固定的几种。
问题二:
一个有全部两个钥匙,一个就只有一个,是不可能死锁的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马