java 难题求解,新手求教! 10

classXc8implementsRunnable{publicstaticintchepiao=100;staticStringaa=newString("1");p... class Xc8 implements Runnable{ public static int chepiao = 100; static String aa=new String("1"); public void run(){ while (true){ synchronized (aa){ if(chepiao>0){ System.out.println("第"+ Thread.currentThread().getName()+"个车站正在卖第"+ (101-chepiao)+"张车票"); chepiao--; }else{ break; } } } }}public class Chepiao{ public static void main(String[] args){ Xc8 xc81=new Xc8(); Thread ee = new Thread(xc81); ee.start(); Xc8 xc82=new Xc8(); Thread ff = new Thread(xc82); ff.start(); }}

求教为何结果输出为101呢 ,我觉得应该是输出100的时候程序就应该停止了啊,因为有个 chepiao>0 这个判断。求指点!!!
展开
 我来答
Forrest_brm
2015-08-14 · TA获得超过327个赞
知道小有建树答主
回答量:217
采纳率:100%
帮助的人:252万
展开全部
首先,先给你改下程序
修改chepiao 为Integer 类型。
synchronized (chepiao)
其次,我说下这么改的原因。很明显,在你的多线程中,chepiao才是多个线程共享并同时操作的资源。你只有保证同一时刻只有一个线程在操作这个“争议资源”才能保证最后结果的准确性。所以 synchronized (chepiao) 而 必须要传一个Object 所以需要把chepiao改为包装类。
aa这个对象显得很多余啊!
101 在我本地也没出现。
分析下101 出现的原因:应该是当chepiao == 0 时,两个线程都进入了if 中,一个先执行了chepiao-- 。为什么能同时执行,我猜测可能是因为你锁住的资源并没有被用到。
soysource
2015-08-14 · TA获得超过400个赞
知道小有建树答主
回答量:370
采纳率:0%
帮助的人:293万
展开全部
你java运行环境是哪个版本?
我本机用jdk1.8试了你的程序,允许多次并不出现101

也许你可以试试clean然后重新编译?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
农家小腊肉
2015-08-14 · 超过16用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:16.1万
展开全部
while()循环执行时是++i,先判断然后计算再执行。建议你去搜关于while循环和for循环的区别
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-08-14
展开全部
不知道你运行结果为什么会有101,
我这里运行是好的。
第Thread-1个车站正在卖第97张车票
第Thread-1个车站正在卖第98张车票
第Thread-1个车站正在卖第99张车票
第Thread-1个车站正在卖第100张车票

运行N多次都是100
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式