黑马程序员技术交流社区

标题: 一个常量赋值的问题 [打印本页]

作者: 张吉日    时间: 2012-10-21 19:55
标题: 一个常量赋值的问题
本帖最后由 张吉日 于 2012-10-21 19:58 编辑

我的问题是中间注释的部分,可能写的不太明白,看明白的给我讲讲吧 谢谢了..............
  1. public class TicketDemo {

  2.         public static void main(String[] args) {
  3.                 Ticket t = new Ticket();
  4.                
  5.                 //t是实现接口,Thread是接收Runnable接口类型的对象
  6.                 Thread t1 = new Thread(t);//创建线程
  7.                 Thread t2 = new Thread(t);
  8.                 Thread t3 = new Thread(t);
  9.                 Thread t4 = new Thread(t);
  10.                 t1.start();
  11.                 t2.start();
  12.                 t3.start();
  13.                 t4.start();
  14.         }
  15. }
  16. /*
  17. * 卖票类
  18. */
  19. class Ticket implements Runnable{         //实现Runnable接口
  20.         private int tick = 100;
  21.         Object obj = new Object();
  22.         public void run(){
  23.                 while(true){
  24.                         if(tick > 0){    // 问题 在这里:: 老毕视频里面的,,,,4个线程 0 1 2 3都挂在这里
  25.                                              //4个线程挂在if(tick > 0 )这里,当tick--时 , tick是通过什么形式,把tick的( -- )的值 赋给下一个线程中的tick
  26.                                              //难道是瞬间把tick-- 的值赋给tick吗? 底层是怎么实现的啊
  27.                         try{Thread.sleep(10);}catch(Exception e){}
  28.                         System.out.println(Thread.currentThread().getName()+"sile: "+tick--);
  29.                         }
  30.                 }
  31.         }
  32. }
复制代码

作者: 占琳    时间: 2012-10-21 19:59
tick是设置一个变量 他的初始值是100
每次线程执行,他都会自减1 然后打印线程的名字
直到tick的值 小于0 停止执行打印 我不明白你哪里不懂了
作者: 陈家明    时间: 2012-10-21 20:23
比如说:当tick = 1;线程t1获取到执行权,判断tick>0满足,这时t1的执行权被t2夺走了,此时t1并没有执行输出语句,tick还是等于1,t2也满足tick>0。当t1重新获得执行权时,执行输出语句tick=1,然后执行tick-1;当t2获得执行权后执行输出语句tick=0; 则出现了安全隐患。
作者: 张吉日    时间: 2012-10-21 21:05
陈家明 发表于 2012-10-21 20:23
比如说:当tick = 1;线程t1获取到执行权,判断tick>0满足,这时t1的执行权被t2夺走了,此时t1并没有执行输 ...

我想问不是 线程的安全问题  安全问题我明白 我是故意没有加锁的 ,我想知道的是  他们4个都挂在if函数那里时,tick是通过什么方式自减的? 他们都没有出循环,tick是瞬间就--  0 -1 -2 -3 是他们4个线程分别取到的值,那么底层是怎么实现的呢




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