java i++非原子操作


i++不是原子操作,也就是說,它不是單獨一條指令,而是3條指令:

1、從內存中把i的值取出來放到CPU的寄存器中

2、CPU寄存器的值+1

3、把CPU寄存器的值寫回內存

如果是單線程操作,i++毫無問題;但是在多核處理器上,用多線程來做i++會有什么問題呢?

i++在兩個線程里邊分別執行100次,能得到的最大值和最小值分別是多少?

=========分析=======

i++是由3條指令構成的運算操作,兩個線程在i變量上共計需要執行100(次循環)*3(條指令)*2(個線程)=600條指令,這600條指令在某種排列下會導致最終i的值僅為2。

(下面是我復制過來的)

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

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

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

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

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

 5. 線程A執行第100次i++,將內存中的值取回CPU1的寄存器,並執行加1,此時CPU1的寄存器中的值為2,內存中為1;

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

 7. 線程A執行100次操作的最后一部分,將CPU1中的寄存器值放回內存,內存中值為2;
【其實他想什么時候從內存中拿 什么時候從cpu返回都是可以的可能的 我們這說的是一種可能】


免責聲明!

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



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