並發是什麼?
並發:是指在某個時間段內,多任務交替的執行任務。當有多個執行緒在操作時,把CPU運行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行。在一個時間段的執行緒程式碼運行時,其它執行緒處於掛起狀。
在並發環境下,程式的封閉性被打破,出現以下特點:
● 並發程序之間有相互制約的關係。直接限制體現為一個程式需要另一個程式的運算結果;間接體現為多個程式競爭共享資源,如處理器、緩衝區等。
● 並發程序的執行過程是斷斷續續的。程序需要記憶現場指令及執行點。
● 當並發數設定合理且CPU擁有足夠的處理能力時,並發會提高程式的運作效率。
在並發環境中,當一個物件可以被多個執行緒存取到時,會造成該物件可以被任何存取的執行緒進行修改,從而出現資料不一致的情況。所以提出線程安全的概念。
並行和並行
是十分容易混淆的概念。並髮指的是多個任務交替進行,而並行則是指真正意義上的「同時進行」。實際上,如果系統內只有一個CPU,使用多執行緒時,在真實系統環境下不能並行,只能透過切換時間片的方式交替進行,從而並發執行任務。真正的平行只能出現在擁有多個CPU的系統中。
【推薦學習:Java影片教學】
#為什麼要用到並發?
並發程式設計在一定程度上離不開多核心CPU的發展。隨著單核CPU的研發已經不能遵循“摩爾定律”(摩爾定律是硬體發展的觀測定律,另外還有基於“摩爾定律”的“反摩爾定律”,不過“反摩爾定律”是軟體領域的定律,有興趣的可以自行了解),硬體工程師們為了進一步提升計算速度,而不是再追求單獨的計算單元,而是將多個計算單元整合到了一起,也就是形成了多核CPU。短短十幾年的時間,家用型CPU,例如Intel i7就可以達到4核心甚至8核心。而專業伺服器通常可以達到幾個獨立的CPU,每個CPU甚至擁有多達8個以上的核心。
因此,「摩爾定律」似乎在CPU核心擴展上繼續被體驗。而在多核心的CPU的背景下,催生了並發程式設計的趨勢,通並發程式的形式可以將多核心CPU的運算能力發揮到極致,效能提升。
在特殊的業務場景下先天的就適合併發程式設計。例如在影像處理領域,一張1024X768像素的圖片,包含達到78萬6千多個像素。即時將所有的像素遍歷一邊都需要很長的時間,面對如此複雜的運算量就需要充分利用多核心的運算的能力。
另外在開發購物平台時,為了提升響應速度,需要拆分,減庫存,生成訂單等等這些操作,就可以進行拆分利用多線程的技術完成。面對複雜業務模型,平行程式會比串列程式更適應業務需求,而並發程式設計吻合更能這種業務拆分正是因為這些優點,使得多執行緒技術能夠得到重視,也是一名CS學習者應該掌握的:
● 充分利用多核心CPU的運算能力;
● 方便進行業務拆分,提升應用效能
並發程式設計有哪些缺點?
1、頻繁的上下文切換
時間片是CPU分配給各個線程的時間,因為時間非常短,所以CPU不斷透過切換線程,讓我們覺得多個線程是同時執行的,時間片一般是幾十毫秒。
每次切換時,需要把目前的狀態保存起來,以便能夠進行恢復先前狀態,而這個切換行為非常損耗性能,過於頻繁切換反而無法發揮出多線程編程的優勢。通常減少上下文切換可以採用無鎖並發程式設計、 CAS演算法、使用最少的執行緒和使用協程。
無鎖定並發程式設計:可以參考的ConcurrentHashMap鎖定分段的思想,不同的執行緒處理不同段的數據,這樣在多執行緒競爭的條件下,可以減少上下文切換的時間。
CAS演算法,利用原子下使用CAS演算法來更新數據,使用了樂觀鎖,可以有效的減少一部分不必要的鎖競爭帶來的上下文切換
使用最少線程:避免創建不需要的線程,例如任務很少,但是創建了很多的線程,這樣會造成大量的線程都處於等待狀態
#協程:在單線程裡實現多任務的調度,並在單執行緒維持多個任務間的切換
由於上下文切換是個相對比較耗時的操作,所以在 “Java的並發編程的藝術” 一書中有過一個實驗,並發累加未必會比串行累加速度快。
2、執行緒的安全性問題
多執行緒程式設計中最難掌握的就是臨界區執行緒安全性問題,稍微不注意就會出現死鎖的情況,一旦產生死鎖就會造成系統功能不可用。
以上是java並發是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!