我有一个for循环
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;
其中C是全局变量。
如果我用2个线程运行这个代码,如果我没有锁定C
部分中的线程,那么c++
的最小值和最大值是什么?
如果你将增量代码转换为汇编代码,它的伪代码就像:
1-mov ax,mem[c]
2-inc ax
3-mov mem[c],ax
如果我们有2个线程考虑这种情况:
thread 1: line 1
thread 2: line (1-2-3) for 99 times
thread 1: line (2-3)
thread 2: line 1
thread 1: line (1-2-3) for remaining 99 times
thread 2: line (2-3) for the last time
现在c的值是2,所以最小值是2
最小值:c + 100如果Thread2在Thread1覆盖之前复制c。
最大值:c + 200如果两个线程按顺序进行
最初假设c=0
马克斯将是200
如果每个线程在彼此之后执行c++
但是在一次迭代中就会发生这种情况。
Min将是100
那是因为c++
基本上是:
temp = c + 1 //line1
c = temp //line2
假设第一个线程执行line1然后第二个线程在该迭代中执行line. The same value will be set.
So
cwill only increase by
1`甚至2个线程尝试增加它。
在Java中,为了使其成为线程安全的:将c
声明为AtomicInteger
并执行c.addAndGet()
以增加它
最小值为c + 100.最大值为c + 200。
当线程彼此相邻时,它们可能在另一个线程更新之前同时获取相同的c值。在这种情况下,两者都会将c更新为相同的值。
如果在最坏的情况下(循环函数的次数)发生这种情况,则该值将仅更新该次数。
如果这种情况从未发生过(最好的情况),例如线程没有同时运行,则值将更新为您希望它们的次数。
我的答案是最低1和最高200。
正如Kibo所说,增量代码如下: 1-mov ax,mem [E] 2斧头 3-mov mem [c],ax
现在让我们用for运行一个例子(int i = 0; i <3; i ++)
T1 line 1 | ==> ax = 0; MEM [C] = 0; T1第2行| ==> ax = 1; MEM [C] = 0; T2行1 | ==> ax = 0; MEM [C] = 0; T1 line 3 | ==> ax = 0; MEM [C] = 0; T2行2 | ==> ax = 1; MEM [C] = 0; T1 line 1 | ==> ax = 0; MEM [C] = 0; T2行3 | ==> ax = 0; MEM [C] = 0; T1第2行| ==> ax = 1; MEM [C] = 0; T2行1 | ==> ax = 0; MEM [C] = 0; T1 line 3 | ==> ax = 0; MEM [C] = 0; T2行2 | ==> ax = 1; MEM [C] = 0; T1 line 1 | ==> ax = 0; MEM [C] = 0; T2行3 | ==> ax = 0; MEM [C] = 0; T1第2行| ==> ax = 1; MEM [C] = 0; T2行1 | ==> ax = 0; MEM [C] = 0; T1 line 3 | ==> ax = 0; MEM [C] = 0; T2行2 | ==> ax = 1; MEM [C] = 0; T2行3 | ==> ax = 1; MEM [C] = 1;
这适用于i = 200