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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焚雨成灰 中级黑马   /  2014-3-20 09:36  /  1260 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 焚雨成灰 于 2014-3-20 10:18 编辑

  • public class Test1{
  •         public static void main(String[] args) {
  •                 new Thread(new TicketSeller()).start();
  •                 new Thread(new TicketSeller()).start();
  •                 new Thread(new TicketSeller()).start();
  •                 new Thread(new TicketSeller()).start();
  •         }
  • }
  • class TicketSeller implements Runnable {
  •         private static int ticket = 100;
  •         Object obj = new Object();
  •         public void  run() {
  •                                 while(ticket > 0) {
  •                                        synchronized(obj) {
  •                                             System.out.println(Thread.currentThread().getName()+" sell a ticket,\t"+"********"+ ticket--);
  •                                        }
  •                                 }
  •         }
  • }
            1.在17行,我用的是while(ticket>0),而毕老师是while(true) if(ticket>0) 这两个有什么区别?
            2.在18行加了同步代码块,为什么打印出来的票数不是100往下步进1递减的


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

倒序浏览
首先你传入了多个匿名对象,没有在操作同一个资源
同步代码块里面判断 if(ticket>0) ,应该是避免出现负数吧
你那种里面也可以加入一个判断啊 while只是为了循环

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
while(true)意思是当满足真时,就进循环,进了循环后,用if(ticket>0)是用来保证100张票逐渐递减,只有大于0时才卖出票去。
第13行中,你定义了一个静态的static int ticket = 100,静态存放于方法区中,而打印中的ticket存放于栈内存中,随着对象的调用才进入堆内存中。
故打印打印出来的票数不是100往下步进1递减的

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
osully 发表于 2014-3-20 09:54
首先你传入了多个匿名对象,没有在操作同一个资源
同步代码块里面判断 if(ticket>0) ,应该是避免出现负数吧
...

嗯,是资源不是同一个造成的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马