Java併發編程的藝術總結

1. 併發編程面臨的挑戰

併發編程的目的:爲了讓程序運行的更快

1.1 上下文切換

時間片:CPU分配給各個線程的時間(幾十毫秒)

CPU通過時間片分配算法來循環執行任務,當上一個任務執行一個時間片後會切換到下一個任務。在進行上下文切換之前,會保存上一個任務的狀態,以便下次切換回這個任務時,可以在加載這個任務的狀態,任務從保存到再加載的過程就是一次上下文切換

與串行執行相比,多線程不一定會快,因爲線程有創建和上下文切換的開銷

1.1.1 減少上下文切換

1)無鎖併發編程:多線程競爭鎖時,會引起上下文切換,可以避免使用鎖,例如:不同線程處理不同段的數據

2)CAS算法:CAS(CompareAndSwap),比較並替換。CAS需要有3個操作數:內存地址V,舊的預期值A,即將要更新的目標值B。CAS指令執行時,當且僅當內存地址V的值與預期值A相等時,將內存地址V的值修改爲B,否則就什麼都不做。整個比較並替換的操作是一個原子操作。CAS是樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。原子操作不需要加鎖。

3)使用最少線程:避免創建不需要的線程

4)使用協程:在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。一種比線程更加輕量級的存在,正如一個進程可以擁有多個線程一樣,一個線程也可以擁有多個協程。協程不是被操作系統內核所管理,而完全是由程序所控制。Java的原生語法中並沒有實現協程(某些開源框架實現了協程,但是很少被使用)

1.2 死鎖

避免死鎖的方法

1)避免一個線程同時獲取多個鎖

2)避免一個線程在鎖內同時佔用多個資源,儘量保證每個鎖只佔用一個資源

3)使用定時鎖(lock.tryLock(timeout))

4)數據庫鎖的加鎖和解鎖必須在一個數據庫連接裏

1.3 資源限制

資源限制是指在進行併發編程時,程序的執行速度受限於計算機硬件或軟件資源。 

解決:硬件(使用集羣並行執行程序);軟件(使用資源池將資源複用)

 

小結:本章主要說了併發編程會遇到的三個問題,並一一闡述了概念以及解決的方法

2. Java併發機制的底層實現原理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章