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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 班志国 中级黑马   /  2012-11-28 17:15  /  1168 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

7 个回复

倒序浏览
多线程是多个线程同步切换进行,买票时会切换着卖,就像火车售票窗口一样,如果正好临到一个窗口时票卖完了,那么也就结束了
回复 使用道具 举报
while(tick>0){
                                               
                                                synchronized   /*在 if 语句的外面加同步代码块,线程1运行完了,把锁打开。
                                                                                当其他线程拿到cpu执行权时,进来先把锁关闭再执行里面的代码,以此类推。。。。,这是我个人的理解*/               
                                                 {
                                                        if(tick>0)
                                                         {   
                                                       
                                                        System.out.println(currentThread().getName()+"sale : "+tick--);
                            }
                                                 }
                     }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
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--);
                            }
                                                 }
                     }

            }

}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
彭璞 发表于 2012-11-28 18:20
线程同步你还没有理解
线程同步 同一时间只保证,一个线程访问方法或变量。
在Java语言中,通过被关键字syn ...

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