java 问题求解!求大神指点! 10

classXc8extendsThread{//继承Threadpublicstaticintchepiao=100;staticStringaa=newString("... class Xc8 extends Thread{//继承Thread public static int chepiao = 100; static String aa=new String("1"); public void run(){ while (chepiao>0){ synchronized (aa){ System.out.println("第"+Thread.currentThread().getName()+"个车站正在卖第"+ (101-chepiao)+"张车票"); chepiao--; } } }}public class Chepiao{ public static void main(String[] args){ Xc8 xc81=new Xc8(); xc81.start(); Xc8 xc82=new Xc8(); xc82.start(); }}

求教为何结果输出为101呢 ,我觉得应该是输出100的时候程序就应该停止了啊,因为有个 chepiao>0 这个判断。求指点!!!
展开
 我来答
百度网友200b114
2015-08-14 · TA获得超过261个赞
知道小有建树答主
回答量:324
采纳率:66%
帮助的人:169万
展开全部
同步时候出现问题,你是先判断chepiao>0再synchronized ;可能出现这种情况:
当前chepiao=1,线程1进入while(chepiao>0),然后cpu调度线程2执行,线程2也可以进入while(chepiao>0);
你可以将sysnchronized放在判断前面解决这个问题
_天外飞狗
2015-08-14 · 超过32用户采纳过TA的回答
知道答主
回答量:96
采纳率:0%
帮助的人:51万
展开全部
当chepiao=1的时候,xc81线程进入到了while循环并拿到了线程锁aa,此时xc82也进入了while循环,没有拿到线程锁aa,卡在了打印方法外边。所以xc82在synchronized(aa){}之前等待xc81结束循环,当xc82结束循环后,xc81拿到线程锁aa,但是chepiao已经等于0,而xc82没有进行while的判断直接就可以执行打印方法。所以打印的是101-0。
修改方法:应该把synchronized(aa)放到while 循环外。
可能表达有点不清楚-。-
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
利刃33
2015-08-14
知道答主
回答量:1
采纳率:0%
帮助的人:1192
展开全部
synchronized (aa)语句应该放在while语句外面,否则在while (chepiao>0)时,chepiao 还没有改变
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式