黑马程序员技术交流社区

标题: 请进来。。。。。 [打印本页]

作者: 班志国    时间: 2012-11-28 17:15
标题: 请进来。。。。。
  1. class Ticket implements Runnable{
  2.             private static int tick = 100;

  3.             public void run{

  4.                      while(tick>0){

  5.                             if(tick>0){//这加上同步代码块 那不就是 线程一  运行完了 线程二才 能进来吗 那线程一 不是把所有的 票买完了吗 其他线程  还怎么买啊
  6.                                  System.out.println(currentThread().getName()+"sale : "+tick--);
  7.                             }

  8.                      }

  9.             }

  10. }

复制代码

作者: 齐银春    时间: 2012-11-28 17:30
多线程是多个线程同步切换进行,买票时会切换着卖,就像火车售票窗口一样,如果正好临到一个窗口时票卖完了,那么也就结束了
作者: 黑马_郑亮新    时间: 2012-11-28 17:44
while(tick>0){
                                               
                                                synchronized   /*在 if 语句的外面加同步代码块,线程1运行完了,把锁打开。
                                                                                当其他线程拿到cpu执行权时,进来先把锁关闭再执行里面的代码,以此类推。。。。,这是我个人的理解*/               
                                                 {
                                                        if(tick>0)
                                                         {   
                                                       
                                                        System.out.println(currentThread().getName()+"sale : "+tick--);
                            }
                                                 }
                     }
作者: 黑马_郑亮新    时间: 2012-11-28 17:45
class Ticket implements Runnable{
            private static int tick = 100;
                        Object ob=new Object();
            public void run{
                               
                     while(tick>0){
                                               
                                                synchronized(ob)  /*在 if 语句的外面加同步代码块,线程1运行完了,把锁打开。
                                                                                当其他线程拿到cpu执行权时,进来先把锁关闭再执行里面的代码,以此类推。。。。,这是我个人的理解*/               
                                                 {
                                                        if(tick>0)
                                                         {   
                                                       
                                                        System.out.println(currentThread().getName()+"sale : "+tick--);
                            }
                                                 }
                     }

            }

}
作者: 梁胜海    时间: 2012-11-28 17:55
线程同步的意义是不让你卖票大于票数,不然扯淡了
作者: 彭璞    时间: 2012-11-28 18:20
线程同步你还没有理解
线程同步 同一时间只保证,一个线程访问方法或变量。
在Java语言中,通过被关键字synchronized修饰的方法或synchronized语句块实现对代码的同步包含在synchronized方法或语句块中的代码称为被同步的代码(Synchronized Code)当线程访问被同步的代码时,必须首先竞争代码所属的类的【对象上的锁】,否则线程将等待(阻塞),直到锁被释放.
上例中if语句加了synchronized只是锁了这一个代码块,当一个线程运行进入这个代码块的时候,这个代码块就被锁住了,不能让其他的线程访问了,其他的线程运行到这只有等这个线程运行完了,释放了这个锁,才能运行;在这个代码块中一个线程只会买一张票,买完了就退出释放锁,不是for循环,不会一直买的,其他线程进来也是买一张票,等某一个线程进来判断tick<0时候,表示没票了,就买不到了
作者: 班志国    时间: 2012-11-28 20:28
彭璞 发表于 2012-11-28 18:20
线程同步你还没有理解
线程同步 同一时间只保证,一个线程访问方法或变量。
在Java语言中,通过被关键字syn ...

同一时间只有一个线程访问方法或变量 是不是 这一个线程 会把 所有变量访问完呢  就如我的代码 ticket-- 一直买到 0 为止??
作者: 彭璞    时间: 2012-11-28 21:33
比方说,一个厕所,现在只能让100个人使用了,然后就关闭不让用了,当一个人进去了,这个厕所就被占用了,其他的人就只能等在外面,等这个人出来才能用,相当于这个厕所被这个人锁住,这个厕所就是你代码中syncronized锁定的代码块,等这个人出来了,这个人只使用了100次机会中的一次,还有99次机会供其他人用的,你的程序中一个线程进入代码块在出来也是一样,只买了一张票,还有99张其他人还能买,而不是这个线程进入代码块,一下子买了100张票,你在体会下




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