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 这个判断。求指点!!! 展开
求教为何结果输出为101呢 ,我觉得应该是输出100的时候程序就应该停止了啊,因为有个 chepiao>0 这个判断。求指点!!! 展开
4个回答
展开全部
首先,先给你改下程序
修改chepiao 为Integer 类型。
synchronized (chepiao)
其次,我说下这么改的原因。很明显,在你的多线程中,chepiao才是多个线程共享并同时操作的资源。你只有保证同一时刻只有一个线程在操作这个“争议资源”才能保证最后结果的准确性。所以 synchronized (chepiao) 而 必须要传一个Object 所以需要把chepiao改为包装类。
aa这个对象显得很多余啊!
101 在我本地也没出现。
分析下101 出现的原因:应该是当chepiao == 0 时,两个线程都进入了if 中,一个先执行了chepiao-- 。为什么能同时执行,我猜测可能是因为你锁住的资源并没有被用到。
修改chepiao 为Integer 类型。
synchronized (chepiao)
其次,我说下这么改的原因。很明显,在你的多线程中,chepiao才是多个线程共享并同时操作的资源。你只有保证同一时刻只有一个线程在操作这个“争议资源”才能保证最后结果的准确性。所以 synchronized (chepiao) 而 必须要传一个Object 所以需要把chepiao改为包装类。
aa这个对象显得很多余啊!
101 在我本地也没出现。
分析下101 出现的原因:应该是当chepiao == 0 时,两个线程都进入了if 中,一个先执行了chepiao-- 。为什么能同时执行,我猜测可能是因为你锁住的资源并没有被用到。
展开全部
你java运行环境是哪个版本?
我本机用jdk1.8试了你的程序,允许多次并不出现101
也许你可以试试clean然后重新编译?
我本机用jdk1.8试了你的程序,允许多次并不出现101
也许你可以试试clean然后重新编译?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
while()循环执行时是++i,先判断然后计算再执行。建议你去搜关于while循环和for循环的区别
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-08-14
展开全部
不知道你运行结果为什么会有101,
我这里运行是好的。
第Thread-1个车站正在卖第97张车票
第Thread-1个车站正在卖第98张车票
第Thread-1个车站正在卖第99张车票
第Thread-1个车站正在卖第100张车票
运行N多次都是100
我这里运行是好的。
第Thread-1个车站正在卖第97张车票
第Thread-1个车站正在卖第98张车票
第Thread-1个车站正在卖第99张车票
第Thread-1个车站正在卖第100张车票
运行N多次都是100
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询