问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请告诉我为什么第二段代码无法正确运行?

发布网友 发布时间:2022-11-17 22:10

我来回答

3个回答

热心网友 时间:2024-11-23 11:55

       楼主,其实两段代码都是有问题的(楼主可以增加循环次数,或者增加线程数量,或者在Bank.jinKu += 100;后添加Sleep语句,来增加异常情况出现的概率)。下面请看我分析第二段代码执行时为什么会出现这样的怪异结果:


       楼主第二段代码的运行结果是:

运行结果为:-----
kkk第1次存入100元后金库里总额为:200(1行)
kkk第2次存入100元后金库里总额为:300(2行)
aaa第1次存入100元后金库里总额为:200(3行)
kkk第3次存入100元后金库里总额为:400(4行)
aaa第2次存入100元后金库里总额为:500(5行)
aaa第3次存入100元后金库里总额为:600(6行)

       分析(这里只针对上面结果提出一个可能的执行顺序,实际上还有很多其他执行顺序,会得到同样的结果):

       1、线程aaa首次执行,执行了Bank.jinKu += 100;后,放弃时间分片(还未进入System.out.println方法),让线程kkk执行。(此时金库值为100);

       2、线程kkk开始执行,执行了一次完整循环体(此时金库值为200)并打印第1行结果出来;

       3、线程kkk放弃时间分片,由线程aaa继续执行,线程aaa继续执行System.out.println并传入与“200”(因为金库被kkk线程+了100)进行字符串链接操作后的参数,进入System.out.println方法后(还没有执行具体的打印方法),放弃时间分片,由线程kkk继续执行;

       4、线程kkk获得时间分片继续执行一次完整循环体(此时金库值为300)并打印第2行结果出来;

       5、线程kkk此时放弃时间分片,由线程aaa获得时间分片,aaa继续执行System.out.println方法,将第3行结果打印出来(请注意这里打印出来200是因为步骤3时已经传入了参数,进入System.out.println后,打印结果就跟变量Bank.jinKu无关了,因为变化的是Bank.jinKu,而传入的是经过字符串链接后产生的一个新的String类型对象,而且就算是String对象变化了,也不会影响到传入到方法中到String对象);

       6、线程aaa放弃时间分片,由kkk继续执行一个完整循环体(此时金库值为400)并打印第4行结果出来;

       7、线程kkk执行完毕,线程消亡,由线程aaa执行两次完整循环体,分别打印结果第5、6行;


       请用同样的方法分析第一段代码可能出现的异常情况。


       楼主使用了synchronized (new Object())来控制并发问题没有达到效果,因为new Object()每次都是生成不同的对象,不是同一个锁标记,因此多个线程还是可以同时访问这段(存钱的)代码。


       为此楼主可以这样改进:

class Bank {
    static Object lock = new Object();
    static int jinKu = 0;
}


       同时,

synchronized (new Object())

改成

synchronized (Bank.lock)

热心网友 时间:2024-11-23 11:55

估计是多线程数据共享乱了的问题,第二种你把它写在两个语句里执行的时候线程交叉了。
如果你给第二种for循环加上断点,f6一条一条执行,输出的数据就是正确的。

热心网友 时间:2024-11-23 11:56

其实很正常,synchronized(new Object)等于没有锁定,因此两个线程同时运行了,就会出现你现在的情况。Bank.jinKu += 100; 两个线程同时运行了,结果都对,然后才执行System.out语句,这时,两次加都完成了,所以就这样了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
人大政协辅助岗是什么 政务辅助人员是干什么 政府辅助人员是什么 努比亚的海拔什么意思 北非努比亚现在怎么样了啊 相邻权的相关法律 梦见老公离世了什么预兆 梦见自己老公走掉 你出轨后 怎么操作才没被发现? 评评怎么造句 求一个魔兽世界人类战士名字 有创意的给个 coloros11指纹解锁怎么设置 FC吞食天地2的存档 ST0的意思 国考公务员考试科目 惠普m439n打印机出产日期 一个手机号注册了两个,怎样解绑第二个? 什么是DLC版本 版和原版+DLC的版本有什么区别,想为信仰充 手机能否复制门禁卡,NFC功能是什么? 热水器巡航和出水断电哪个好 电热水器巡航系统费电吗? 怎么把手机上的siri关闭啊? 百度网盘上传照片是原图吗 维奥乐力产品好不好 秋天女人喝什么茶保养 秋天女人喝啥茶保养 免费网页模板哪里有? 请问我的oppofind7弯了,但是整体没事电池也没问题,就是不能开机,会有... ...有一个企鹅在屏幕中间怎么解决呢?我的手机是oppo 优乐多中奖怎么换 ai中如何把空白部分变成与图纸一样颜色 腰总是酸痛是怎么回事 华信众恒咨询待遇前景怎么样 中通服和华信咨询设计研究院是一家吗 嘉兴华信工程咨询有限公司预决算工作算是会计吗 去卧佛寺必须进植物园吗 北京卧佛寺怎么预约 北京卧佛寺门票在哪可以预约 掌上无限科技骗局是真的吗 海默科技是什么行业板块?海默科技什么时候公布业绩?海默科技属于哪个版 ... 福建掌链信息科技股份公司什么时侯点敲钟上市 为什么彧字很吓人?彧字用于人名有点凶? 为什么不建议用彧字起名字?彧字取名是吉还是凶? 网贷逾期会打联系人电话吗? 樱花折下来后怎么养,可扦插嫁接不能养在水里 樱花插枝能活吗 樱花插枝能活 康城悬旗有番外吗 悬旗中梁京京父亲找到了吗 外星人x15r1怎么样?外星人x15r1散热 适合幼儿园户外活动音乐