黑马程序员技术交流社区

标题: 【已解决】同步代码块问题!求前辈看看怎么回事 [打印本页]

作者: 奋斗的小耗子    时间: 2014-7-1 20:44
标题: 【已解决】同步代码块问题!求前辈看看怎么回事
本帖最后由 奋斗的小耗子 于 2014-7-2 11:36 编辑
  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. }
复制代码

学习到了多线程的学习到了多线程的安全问题解决方式,题目是多个窗口同时卖票,有四个线程同时运行,
当使用了synchronized方法后,运行时却始终是一个线程在处理,后来索性照着毕老师视频里的代码写,
可结果还是不一样,请大家看看,帮忙分析下是什么原因,小弟刚解除JAVA,还望多多关照~


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

运行结果

运行结果

作者: 奋斗的小耗子    时间: 2014-7-1 20:56
难道没发表成功?!:o
作者: ╭月牙湾湾╮    时间: 2014-7-2 01:37
你自己定义的线程没有start吧
作者: lvc    时间: 2014-7-2 01:57
本帖最后由 lvc 于 2014-7-2 02:03 编辑

Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
new Thread (t1,"t1").start();
new Thread (t2,"t2").start();
这样就是两个线程了。我没上机运行过哦。

作者: 奋斗的小耗子    时间: 2014-7-2 11:19
╭月牙湾湾╮ 发表于 2014-7-2 01:37
你自己定义的线程没有start吧

代码没有显示出来,定义的线程是这样的
Ticket t = new Ticket();
                new Thread(t).start();//创建了一个线程
                new Thread(t).start();//创建了一个线程
                new Thread(t).start();//创建了一个线程
                new Thread(t).start();//创建了一个线程
作者: 奋斗的小耗子    时间: 2014-7-2 11:22
lvc 发表于 2014-7-2 01:57
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
new Thread (t1,"t1").start();

现在解决了,把sleep加到100,,tick数值加到1000,就会偶尔出现多线程,虽然概率很低,但起码说明多线程实现了,谢谢~
作者: 奋斗的小耗子    时间: 2014-7-2 11:31
lvc 发表于 2014-7-2 01:57
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
new Thread (t1,"t1").start();

能运行的,也能出现两个线程交替运行的情况,
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
是不是new了两个Ticket对象出来,而视频中new了一个对象,而使用了两个线程,具体区别是什么呢
Ticket t = new Ticket();
new Thread(t).start();//创建了一个线程
new Thread(t).start();//创建了一个线程
作者: 奋斗的小耗子    时间: 2014-7-2 17:15

原来原因不在sleep时间的多少,不管哪个线程执行到sleep处,此时是有obj锁的,就算sleep时间为1000,其他线程也进不来,而当try{Thread.sleep(10);}catch(Exception e){}语句放倒同步方法外时,当前线程释放锁且sleep,其他线程就进来了,即使票为100也能很明显的看到其他进程运行的信息。
sleep亦可注释,把tick稍微调高一点也一样能看到多线程运行
作者: 奋斗的小耗子    时间: 2014-7-2 17:19
lvc 发表于 2014-7-2 01:57
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
new Thread (t1,"t1").start();

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




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