java 难题求解,新手求教!

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 这个判断。求指点!!!

首先,先给你改下程序
修改chepiao 为Integer 类型。
synchronized (chepiao)
其次,我说下这么改的原因。很明显,在你的多线程中,chepiao才是多个线程共享并同时操作的资源。你只有保证同一时刻只有一个线程在操作这个“争议资源”才能保证最后结果的准确性。所以 synchronized (chepiao) 而 必须要传一个Object 所以需要把chepiao改为包装类。
aa这个对象显得很多余啊!
101 在我本地也没出现。
分析下101 出现的原因:应该是当chepiao == 0 时,两个线程都进入了if 中,一个先执行了chepiao-- 。为什么能同时执行,我猜测可能是因为你锁住的资源并没有被用到。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-08-14
你java运行环境是哪个版本?
我本机用jdk1.8试了你的程序,允许多次并不出现101

也许你可以试试clean然后重新编译?
第2个回答  2015-08-14
while()循环执行时是++i,先判断然后计算再执行。建议你去搜关于while循环和for循环的区别
第3个回答  2015-08-14
不知道你运行结果为什么会有101,
我这里运行是好的。
第Thread-1个车站正在卖第97张车票
第Thread-1个车站正在卖第98张车票
第Thread-1个车站正在卖第99张车票
第Thread-1个车站正在卖第100张车票

运行N多次都是100

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网