黑马程序员技术交流社区

标题: 【已解决】多线程的同步代码块问题!求前辈看看怎么... [打印本页]

作者: 奋斗的小耗子    时间: 2014-7-1 20:40
标题: 【已解决】多线程的同步代码块问题!求前辈看看怎么...
本帖最后由 奋斗的小耗子 于 2014-7-2 11:35 编辑

学习到了多线程的学习到了多线程的安全问题解决方式,题目是多个窗口同时卖票,有四个线程同时运行,当使用了synchronized方法后,运行时却始终是一个线程在处理,之后把Tick改成4000也没用,后来索性照着毕老师视频里的代码写,
可结果还是不一样,请大家看看,帮忙分析下是什么原因,小弟刚解除JAVA,还望多多关照~
  1. class Ticket implements Runnable
  2. {
  3.         private int tick = 100;//100张
  4.         Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 while(true)
  8.                 {
  9.                         synchronized(obj)
  10.                         {
  11.                                 if(tick>0)
  12.                                 {
  13.                                         try{Thread.sleep(10);}catch(Exception e){}
  14.                                         System.out.println(Thread.currentThread().getName()+"...sale:"+tick--);
  15.                                 }
  16.                         }
  17.                 }
  18.         }
  19. }
  20. class TicketDemo
  21. {
  22.         public static void main(String[] args)
  23.         {
  24.                 Ticket t = new Ticket();
  25.                 new Thread(t).start();//创建了一个线程
  26.                 new Thread(t).start();//创建了一个线程
  27.                 new Thread(t).start();//创建了一个线程
  28.                 new Thread(t).start();//创建了一个线程
  29.         }
  30. }
复制代码




wenti.JPG (85.18 KB, 下载次数: 26)

运行结果

运行结果

作者: 奋斗的小耗子    时间: 2014-7-1 21:10
没有人吗!!!!:L
作者: 任黎明    时间: 2014-7-1 22:08
等待的时间太短了,Thread.sleep(100);睡个100毫秒试试
作者: 心者觉也    时间: 2014-7-1 23:41
楼上正解,把sleep时间加长即可
作者: alexsoon    时间: 2014-7-2 08:45
三楼正解
作者: 亦金亦水    时间: 2014-7-2 08:58
楼上都正解
作者: 奋斗的小耗子    时间: 2014-7-2 11:27
任黎明 发表于 2014-7-1 22:08
等待的时间太短了,Thread.sleep(100);睡个100毫秒试试

现在解决了,把sleep加到100,,tick数值加到1000,就会偶尔出现多线程,虽然概率很低,但起码说明多线程实现了,谢谢~
作者: 奋斗的小耗子    时间: 2014-7-2 17:14
原来原因不在sleep时间的多少,不管哪个线程执行到sleep处,此时是有obj锁的,就算sleep时间为1000,其他线程也进不来,而当try{Thread.sleep(10);}catch(Exception e){}语句放倒同步方法外时,当前线程释放锁且sleep,其他线程就进来了,即使票为100也能很明显的看到其他进程运行的信息。
sleep亦可注释,把tick稍微调高一点也一样能看到多线程运行
作者: 奋斗的小耗子    时间: 2014-7-2 17:17
任黎明 发表于 2014-7-1 22:08
等待的时间太短了,Thread.sleep(100);睡个100毫秒试试


原来原因不在sleep时间的多少,不管哪个线程执行到sleep处,此时是有obj锁的,就算sleep时间为1000,其他线程也进不来,而当try{Thread.sleep(10);}catch(Exception e){}语句放倒同步方法外时,当前线程释放锁且sleep,其他线程就进来了,即使票为100也能很明显的看到其他进程运行的信息。
sleep亦可注释,把tick稍微调高一点也一样能看到多线程运行




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