每日一题:day001
题目:有两个线程A和B,有一个公共变量a的初始值为0,A,B两个线程同时对a的值执行以下代码,则a可能的值为?boolean isOdd = false;
for (int i = 1; i <= 2; ++i) {
if (i % 2 == 1)
isOdd = true;
else
isOdd = false;
a += i * (isOdd ? 1 : -1);
}
解答:可能的值分为别-1,0,-2
前提分析:该程序执行两次,每次执行都是对a先+1,然后-2;
为-1时:两个线程几乎同时执行完成,如图:
为0时:线程A在第二次读的时候线程B也刚好读,最后把线程A的第二次写给覆盖了。如图:
为-2时:线程A正常执行,完了之后,线程B才开始执行,如图:
自我理解:本题的主要考察点就是线程的执行顺序,把这个理解的透彻了,这个题就迎刃而解了。 支持 Max472 发表于 2021-8-12 12:07
支持
谢谢,也是为了给java板块积攒一点人气吧,有没有人看都无所谓了{:10_266:} 感谢分享! 支持
感谢分享 {:5_109:} 感谢 666 {:5_109:} 支持 {:10_257:} {:10_254:} 没看懂【i * (isOdd ? 1 : -1);】{:5_100:} sunyt 发表于 2021-8-13 16:13
没看懂【i * (isOdd ? 1 : -1);】
这句话用了三目运算符,可以拆解如下:
if(isOdd){
a=a+(i*1);
}else{
a=a+(i*-1);
} 加油~ 连帅帅 发表于 2021-8-13 16:28
这句话用了三目运算符,可以拆解如下:
if(isOdd){
a=a+(i*1);
这么一说我就懂了,谢谢{:5_109:} 感谢分享
{:9_228:}
页:
[1]