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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 奋斗的小耗子 于 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, 下载次数: 24)

运行结果

运行结果

8 个回复

倒序浏览
没有人吗!!!!:L
回复 使用道具 举报
等待的时间太短了,Thread.sleep(100);睡个100毫秒试试
回复 使用道具 举报
楼上正解,把sleep时间加长即可
回复 使用道具 举报
三楼正解
回复 使用道具 举报
楼上都正解
回复 使用道具 举报
任黎明 发表于 2014-7-1 22:08
等待的时间太短了,Thread.sleep(100);睡个100毫秒试试

现在解决了,把sleep加到100,,tick数值加到1000,就会偶尔出现多线程,虽然概率很低,但起码说明多线程实现了,谢谢~
回复 使用道具 举报
原来原因不在sleep时间的多少,不管哪个线程执行到sleep处,此时是有obj锁的,就算sleep时间为1000,其他线程也进不来,而当try{Thread.sleep(10);}catch(Exception e){}语句放倒同步方法外时,当前线程释放锁且sleep,其他线程就进来了,即使票为100也能很明显的看到其他进程运行的信息。
sleep亦可注释,把tick稍微调高一点也一样能看到多线程运行
回复 使用道具 举报
任黎明 发表于 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稍微调高一点也一样能看到多线程运行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马