java 中多线程中的四个窗口卖100张票问题 我的答案是

publicclassTest34{publicstaticvoidmain(String[]args){newTickesSellers().start();newTi... public class Test34 {
public static void main(String[] args) {
new TickesSellers().start();
new TickesSellers().start();
new TickesSellers().start();
new TickesSellers().start();
}
// TODO Auto-generated method stub

}
我给的答案是:
class TickesSellers extends Thread {
private static int num = 1000;
Object obj = new Object();

public void run() {

while (num > 0) {
synchronized (obj) {

System.out.println(getName() + "这是第" + num-- + "张票");
}

}
}

}
不理解为什么答案都是 while(ture) if(){break;}{}这种结构 有必要吗? 为什么?
package cn.itcast.thread;

public class Demo12_Tickets {

/**
* @param args
*/
public static void main(String[] args) {
/*TicketSeller ts1 = new TicketSeller();
TicketSeller ts2 = new TicketSeller();
TicketSeller ts3 = new TicketSeller();
TicketSeller ts4 = new TicketSeller();
ts1.start();
ts2.start();
ts3.start();
ts4.start();
*/
new TicketSeller().start();
new TicketSeller().start();
new TicketSeller().start();
new TicketSeller().start();
}

}
/*
* 有一百张火车票,要求是用四个窗口同时卖票,模拟这个操作
*/

class TicketSeller extends Thread { //定义卖票窗口继承线程类
private static int tickets = 100; //定义票
private static Object obj = new Object();
public void run() { //重写run方法将卖票的操作写在run方法中
while(true) {
synchronized(obj) {
if(tickets <= 0){
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {

e.printStackTrace();
}
System.out.println(getName() + ": 这是第" + tickets-- + "号票");//1234
//tickets--;
}
}
}
}
展开
 我来答
百度网友33dcad5a0
2013-10-30 · TA获得超过164个赞
知道答主
回答量:69
采纳率:100%
帮助的人:81.6万
展开全部
你的答案有两个问题:
1,obj不是static,就是说每个线程都有自己的obj,synchronize锁的是自己线程的obj,不能起到阻塞其它线程的作用。运行的话会看到有的票被出售多次。

2,while (num > 0)在syncronize之外,因为没被同步,其它线程可能在对比num > 0之后修改num的值,可能导致计数为负数的票被卖出,或者其它奇怪的结果。

所以最后的答案才能得到可靠的结果。
LycrusHamster
2013-10-30 · TA获得超过889个赞
知道小有建树答主
回答量:487
采纳率:100%
帮助的人:114万
展开全部
有 多线程可能大家同时发现有票 但是只有1个能进行操作
如果在前面的操作结束后 后面的操作不进行判断 很可能形成票已经不够了 但是你还是操作了
所以要再做一次判断

还有private static Object obj = new Object();有写麻烦

你直接synchronized(this.getClass())也可以
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8c35aa0
2013-10-30 · TA获得超过287个赞
知道小有建树答主
回答量:307
采纳率:100%
帮助的人:241万
展开全部
票有卖完的时候,票都卖完了,还有必要继续循环吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式