黑马程序员技术交流社区
标题:
多线程卖票问题
[打印本页]
作者:
焚雨成灰
时间:
2014-3-20 09:36
标题:
多线程卖票问题
本帖最后由 焚雨成灰 于 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递减的
作者:
osully
时间:
2014-3-20 09:54
首先你传入了多个匿名对象,没有在操作同一个资源
同步代码块里面判断 if(ticket>0) ,应该是避免出现负数吧
你那种里面也可以加入一个判断啊 while只是为了循环
作者:
sgs_gzy
时间:
2014-3-20 10:06
while(true)意思是当满足真时,就进循环,进了循环后,用if(ticket>0)是用来保证100张票逐渐递减,只有大于0时才卖出票去。
第13行中,你定义了一个静态的static int ticket = 100,静态存放于方法区中,而打印中的ticket存放于栈内存中,随着对象的调用才进入堆内存中。
故打印打印出来的票数不是100往下步进1递减的
作者:
焚雨成灰
时间:
2014-3-20 10:20
osully 发表于 2014-3-20 09:54
首先你传入了多个匿名对象,没有在操作同一个资源
同步代码块里面判断 if(ticket>0) ,应该是避免出现负数吧
...
嗯,是资源不是同一个造成的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2