既然CPU同一時間只能執行一個線程,爲何存在併發問題

一點小疑惑終於解開啦

1.CPU的時間是按時間片分的,而不是一個時間點,併發問題是因爲CPU線程切換致使的。

  如今假設有一段代碼java

if(i == 1) {
    i++;  //斷點1
    system.out.print(i);        
} //斷點2

  有兩個線程A,B同時執行這一段代碼,假設A線程先被CPU調度,然而A線程在斷點1處,時間片到期了,此時A線程的代碼並無執行完,可是CPU此時會調度B線程,並不會管A線程是否是執行完了這一段代碼。併發

  再接着假設B線程如今執行完了這一段代碼(固然也可能沒有執行完),CPU 如今就又會調度A線程,而且從A線程的斷點1處繼續執行(注意不是從新執行,CPU切換的時候保存了線程的上下文)線程

  總結一下:CPU切換線程並不會管你線程是否將代碼執行完,而是和分給線程的時間片是否到期有關,時間片到期了就會切換線程,併發也就由此產生了。blog

相關文章
相關標籤/搜索