並發與並行
#並發:是指在某個時間段內,多任務交替的執行任務。當有多個執行緒在操作時,把CPU運行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行。在一個時間段的執行緒程式碼運行時,其它執行緒處於掛起狀。
並行:是指在同一時刻同時處理多任務的能力。當有多個執行緒在操作時,cpu同時處理這些執行緒請求的能力。
所以在並發環境下,程式的封閉性被打破,出現以下特點:
1、並發程式之間有相互制約的關係。直接限制體現為一個程式需要另一個程式的運算結果;間接體現為多個程式競爭共享資源,如處理器、緩衝區等。
2、並發程式的執行過程是斷斷續續的。程序需要記憶現場指令及執行點。
3、當並發數設定合理且CPU擁有足夠的處理能力時,並發會提高程式的運作效率。
在並發環境中,當一個物件可以被多個執行緒存取到時,會造成該物件可以被任何存取的執行緒進行修改,從而出現資料不一致的情況。所以提出線程安全的概念。
執行緒基本概念介紹
#執行緒與進程
進程:每個行程都有獨立的程式碼和資料空間(進程上下文),進程間的切換會有較大的開銷,一個行程包含1--n個執行緒。 (進程是資源分配的最小單位) 。簡單講進程就是在某種程度上相互隔離的、獨立運作的程式。
執行緒:同一類別執行緒共享程式碼和資料空間,每個執行緒有獨立的運行堆疊和程式計數器(PC),執行緒切換開銷小。 (執行緒是cpu調度的最小單位)
執行緒和進程一樣分為五個階段:建立、就緒、運行、阻塞、終止。
1、建立: 新建立了一個執行緒對象,還未呼叫start()方法。如 Thread thread = new Thread();
2、就緒: 執行緒物件建立後,其他執行緒(例如main執行緒)呼叫了該物件的start()方法。該狀態的執行緒位於可運行執行緒池中,等待被執行緒調度選取 取得cpu 的使用權 。
3、運行: 運行狀態(runnable)的執行緒獲得了cpu 時間片(timeslice) ,執行程式碼。
4、阻塞(Blocked):線程被阻塞了,「阻塞狀態」與「等待狀態」的區別是:「阻塞狀態」在等待著獲取到一個排它鎖,這個事件將在另外一個執行緒放棄這個鎖的時候發生;而「等待狀態」則是在等待一段時間,或是喚醒動作的發生。在程式等待進入同步區域(synchronized)的時候,執行緒將進入這種狀態。
(一). 等待阻塞: 執行(running) 的執行緒執行o.wait()方法,JVM會把該執行緒放入等待佇列(waitting queue)。
(二). 同步阻塞: 執行(running) 的執行緒在取得物件的同步鎖定時,若該同步鎖定被別的執行緒佔用,則JVM會把該執行緒放入鎖池(lock pool )中。
(三). 其他阻塞: 執行(running) 的執行緒執行Thread.sleep(long ms)或t.join()方法,或發出了I/O請求時,JVM會把該執行緒置為阻塞狀態。當sleep()狀態逾時、join()等待執行緒終止或逾時、或I/O處理完畢時,執行緒重新轉入 可運行(runnable) 狀態。
5、等待: 進入該狀態的執行緒需要等待其他執行緒做出一些特定動作(通知或中斷)。
6、阻塞:當一個執行緒試圖取得一個內部的物件鎖定(非java.util.concurrent函式庫中的鎖定),而該鎖定被其他執行緒持有,則該執行緒進入阻塞狀態。
7、等待:當一個執行緒等待另一個執行緒通知調度器一個條件時,該執行緒進入等待狀態。例如呼叫:Object.wait()、Thread.join()以及等待Lock或Condition。
8、逾時等待(TIMED_WAITING):此狀態不同於WAITING,它可以在指定的時間後自行回傳。
9、終止(TERMINATED):表示該執行緒已經執行完畢。
以上是java什麼是並發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!