黑马程序员技术交流社区

标题: 关于毕老师视频代码中锁的疑问?问题在题中。 [打印本页]

作者: 王广亚    时间: 2013-8-25 13:11
标题: 关于毕老师视频代码中锁的疑问?问题在题中。
本帖最后由 王广亚 于 2013-8-25 15:02 编辑

  1. class Ticket implements Runnable{
  2.         private int tick=1000;
  3.         String name;
  4.         Object obj=new Object();
  5. //        @Override
  6.         public Ticket(String name){
  7.                 this.name=name;
  8.         }
  9.         public void run() {
  10.                 System.out.println(Thread.currentThread().getName()+"----------------");               
  11.                 while(true){
  12.                         synchronized(obj){
  13.                                 if(tick>0){                        //<font color="red">问题:此处问什么要加个if判断语句,既然有while语句为何不把这个位置的if语句替换成while(tick>0)。而把上面的while去掉呢?</font>
  14.                                         try{
  15.                                         Thread.sleep(12);
  16.                                         }catch(Exception e){}
  17.                                                 System.out.println(this.getName()+"号列车"+Thread.currentThread().getName()+". ..sale"+tick--);
  18.                                 }
  19.                         }        
  20.                 }
  21.         }
  22.         private String getName() {
  23.                 // TODO Auto-generated method stub
  24.                 return name;
  25.         }        
  26. }

  27. public class TickeDemo {

  28.         public static void main(String[] args) {
  29.                   Ticket t=new Ticket("-k2038-");//
  30.                   Thread t1=new Thread(t,"-001窗口");
  31.                   Thread t2=new Thread(t,"-002窗口");
  32.                   Thread t3=new Thread(t,"-003窗口");
  33.                   Thread t4=new Thread(t,"-004窗口");
  34.                   t1.start();
  35.                   t2.start();
  36.                   t3.start();
  37.                   t4.start();
  38.         }
  39. }

复制代码

作者: ~路@人#甲~    时间: 2013-8-25 13:48
你的意思如果是以下这样?那么就会导致只有一个线程在执行,其他线程进不来!
                      synchronized(obj){
                              while(tick>0){                       
                                        try{
                                        Thread.sleep(12);
                                        }catch(Exception e){}
                                                System.out.println(this.getName()+"号列车"+Thread.currentThread().getName()+". ..sale"+tick--);
                                }
                        }        
                }

如果是下边这样,这会导致线程的不安全,如果在tick=1时所有的线程都进入了while语句内,就会导致负数的出现!
  while(tick>0){
                        synchronized(obj){               
                                        try{
                                        Thread.sleep(12);
                                        }catch(Exception e){}
                                                System.out.println(this.getName()+"号列车"+Thread.currentThread().getName()+". ..sale"+tick--);
                                }                     
                }
作者: 张聪珉    时间: 2013-8-25 13:52
首先你要明白同步代码块是放多个线程共同操作的数据,也是是多个窗口卖票,再来,if和while语句的区别是
if语句只执行一次,如果t1线程,进来了就拿到了锁,假如ticket>0,卖了一张票,执行完if语句后,就释放了锁,让别的线程进来,当然也有可能是t1线程自己又进来一次,
而这里如果你用while语句的话意思就是有一个线程进来之后,就会一直循环卖票,直到把票卖完,才出去,那这样自,就只是单线程卖票而不是多线程卖票,
把while定义在外面目的是为了让多个线程都在while语句里面循环,而不是只执行一次线程就 结束
作者: javamov    时间: 2013-8-25 14:27
这个位置的if语句替换成while(tick>0)。而把上面的while去掉呢?

如果if语句替换成while(tick>0),而把上面的while去掉;这样和单线程没什么区别。
作者: 薛鹏鹏    时间: 2013-8-25 14:35
如果您的问题已经解决
请更改分类未解决为已解决
保持队形,谢谢合作

详情参考 如何修改分类

作者: 王广亚    时间: 2013-8-25 15:02
谢各位。very good!




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