黑马程序员技术交流社区

标题: 多线程同步函数的锁问题 [打印本页]

作者: ZHMing    时间: 2013-12-6 14:18
标题: 多线程同步函数的锁问题
  1. public class TicketDemo {
  2. public static void main(String args[])
  3. {

  4. Ticket t= new Ticket();
  5. Thread t1=new Thread(t);
  6. Thread t2=new Thread(t);
  7. t1.start();
  8. try{ Thread.sleep(10);}catch(Exception e){}
  9. t.flag= false;
  10. t2.start();
  11. }
  12. }
  13. class Ticket implements Runnable
  14. {
  15. boolean flag = true;
  16. private int ticket =100;
  17. //Object obj=new Object();
  18. public void run()
  19. {
  20. if(flag)
  21. {
  22. while(true)
  23. {
  24. synchronized(this)
  25. {
  26. if(ticket>0)
  27. {
  28. try{Thread.sleep(10);}catch(Exception e){}
  29. System.out.println(Thread.currentThread().getName()+"....code==="+ticket--);
  30. }
  31. }
  32. }
  33. }
  34. else
  35. while(true)
  36. show();
  37. }
  38. public synchronized void show(){
  39. if(ticket>0)
  40. {
  41. try{Thread.sleep(10);}catch(Exception e){}
  42. System.out.println(Thread.currentThread().getName()+"....show="+ticket--);
  43. }
  44. }
  45. }
复制代码

主方法t.flag已经赋值成false了。run方法里不就一直调用show了么。为什么还会执行if(flag)
作者: 王家胜    时间: 2013-12-6 15:59
  1. public class TicketDemo
  2. {
  3.         public static void main(String args[])
  4.         {

  5.                 Ticket t = new Ticket();
  6.                 Thread t1 = new Thread(t);
  7.                 Thread t2 = new Thread(t);
  8.                 t1.start();
  9.                 try
  10.                 {
  11.                         Thread.sleep(10);
  12.                 } catch (Exception e)
  13.                 {
  14.                 }
  15.                 t.flag = false;
  16.                 t2.start();
  17.         }
  18. }

  19. class Ticket implements Runnable
  20. {
  21.         boolean flag = true;
  22.         private int ticket = 100;

  23.         // Object obj=new Object();
  24.         public void run()
  25.         {
  26.                         while (true)
  27.                         {
  28.                                 synchronized (this)
  29.                                 {
  30.                                         if (flag)
  31.                                         {
  32.                                                 if (ticket > 0)
  33.                                                 {
  34.                                                         try
  35.                                                         {
  36.                                                                 Thread.sleep(10);
  37.                                                         } catch (Exception e)
  38.                                                         {
  39.                                                         }
  40.                                                         System.out.println(Thread.currentThread().getName()
  41.                                                                         + "....code===" + ticket--);
  42.                                                 }
  43.                                         }
  44.                                         else
  45.                                                 while (true)
  46.                                                         show();
  47.                                 }
  48.                         }
  49.         }

  50.         public synchronized void show()
  51.         {
  52.                 if (ticket > 0)
  53.                 {
  54.                         try
  55.                         {
  56.                                 Thread.sleep(10);
  57.                         } catch (Exception e)
  58.                         {
  59.                         }
  60.                         System.out.println(Thread.currentThread().getName() + "....show="
  61.                                         + ticket--);
  62.                 }
  63.         }
  64. }
复制代码

if写在循环外了,进入while(true)就出不来了




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