面試 ---- i++在兩個線程中分別執行100次,最大值和最小值分別是多少?


i++只需要執行一條指令,並不能保證多個線程i++,操作同一個i變量,可以得到正確的結果。因為還有寄存器的因素,多個CPU對應多個寄存器。每次要先把i從內存中復制到寄存器,然后++,然后再把i復制到內存中,這需要至少步。從這個意義上講,說i++是原子操作的並不對。

如此,假設兩個線程的執行步驟如下:

1、線程A執行第一次i++,取出內存中i的值,值為0,存放到寄存器后執行加1,此時CPU1中的寄存器值為1,內存中為0;

注:對於多線程,線程共用一個內存,如果線程A再寄存器執行操作后而沒有寫入操作,則會切換到另外一個線程。

2、線程B執行第一次i++,取出內存中的i,值為0,存放到寄存器后執行加1,此時CPU2的寄存器中值為1,內存中為0;

3、線程A繼續執行完成第99次i++,將其值放回內存,此時CPU1中的寄存器值為99,內存中為99;

注:線程A在此的每一步執行,都寫回內存,直到完成第99次

4、線程B繼續執行第一次i++,將其值放回內存,此時CPU1中的寄存器值為1,內存中為1;

注:由於線程B之前未寫回內存,因此停留再第一次,而當前寫回的時候,覆蓋了原來的99,內存中的值變為1

5、線程A執行第100次i++,將內存中的值(現在是1)取回CPU1的寄存器!!,並執行加1,此時CPU1的寄存器中的值為2,內存中為1;

6、線程B執行完所有操作,並將其放回內存,此時CPU2的寄存器值為100,內存中為100;

注:B執行完100次i++,則CPU2寄存器值為100,寫入內存,100覆蓋了原來的1

7、線程A執行100次操作的最后一部分,將CPU1中的寄存器值放回內存(值為2,見第5步),內存中的值為2;

8、結束!!

注:最大值200的情況,就說兩個線程在執行的時候均沒有被中斷,交替執行

所以,該題目便可以得出最終結果,最小值為2,最大值為200.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM