1. 程式人生 > >既然CPU同一時間只能執行一個執行緒,為什麼存在併發問題

既然CPU同一時間只能執行一個執行緒,為什麼存在併發問題

一點小疑惑終於解開啦

1.CPU的時間是按時間片分的,而不是一個時間點,併發問題是由於CPU執行緒切換導致的。

  現在假設有一段程式碼

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切換執行緒並不會管你執行緒是否將程式碼執行完,而是和分給執行緒的時間片是否到期有關,時間片到期了就會切換執行緒,併發也就由此產生了。