连帅帅 发表于 2021-8-12 11:45:59

每日一题: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:30

支持

连帅帅 发表于 2021-8-12 16:59:37

Max472 发表于 2021-8-12 12:07
支持

谢谢,也是为了给java板块积攒一点人气吧,有没有人看都无所谓了{:10_266:}

hornwong 发表于 2021-8-12 19:59:07

感谢分享!

TramBradr 发表于 2021-8-12 19:59:47

支持

fxj2002 发表于 2021-8-12 20:06:58

感谢分享

chenmingfan 发表于 2021-8-12 20:36:01

{:5_109:}

Kayko 发表于 2021-8-13 08:43:51

感谢

不大不小甲鱼 发表于 2021-8-13 08:55:58

666

trolwy 发表于 2021-8-13 10:00:52

{:5_109:}

冰清玉洁丸 发表于 2021-8-13 15:20:19

支持

Kayko 发表于 2021-8-13 16:02:42

{:10_257:}

Kayko 发表于 2021-8-13 16:04:01

{:10_254:}

sunyt 发表于 2021-8-13 16:13:25

没看懂【i * (isOdd ? 1 : -1);】{:5_100:}

连帅帅 发表于 2021-8-13 16:28:47

sunyt 发表于 2021-8-13 16:13
没看懂【i * (isOdd ? 1 : -1);】

这句话用了三目运算符,可以拆解如下:
if(isOdd){
a=a+(i*1);
}else{
a=a+(i*-1);
}

不二如是 发表于 2021-8-13 18:29:42

加油~

sunyt 发表于 2021-8-14 17:59:57

连帅帅 发表于 2021-8-13 16:28
这句话用了三目运算符,可以拆解如下:
if(isOdd){
a=a+(i*1);


这么一说我就懂了,谢谢{:5_109:}

亲爱の明日香 发表于 2021-8-17 08:08:53

感谢分享

Rebecca2021 发表于 2021-8-18 08:38:37

{:9_228:}
页: [1]
查看完整版本: 每日一题:day001