1. 程式人生 > 實用技巧 >高併發——一基本概念

高併發——一基本概念

主要內容(鎮樓!)
1.常見高併發基礎:synchronized、volatile、happens-before、CAS、ThreadPoolExecutor、Executor、ThreadLocal、Condition、Semaphore;
2.經典併發工具:automic、ABA、ReentrantLock、ReadWriteLock、Adder、Accumulator、 StampedLock、CopyOnWriteArrayList、ConcurrentHashMap、CopyOnWriteArraySet、FutureTask、Fork/Join、BlockingQueue;
3.核心併發模式:Immutability、Copy-on-Write、GuardSuspension 、Balking、Thread-Per-Message、WorkerThread

;
4.併發程式設計框架:HikariCP、Netty、Akka、 Amino等。
Java併發程式設計核心
一.基本概念
1.1什麼是程序?
兩個程式,都包含輸入輸出操作(用到記憶體 外設),其他操作(cpu 記憶體)
單核cpu 單道,先執行 a上部分 a的輸入輸出部分 a下部分,再執行b的上部分 b的輸入輸出部分 b下部分
單核cpu 多道,先執行 a 上部分 a的輸入輸出部分
b的上部分 b的輸入輸出部分
a的下部分 b的下部分
也就是
在這裡插入圖片描述
在這裡插入圖片描述
儲存a執行的狀態,切換到b,儲存b的狀態,切換到上次a的狀態,重新開始b的狀態.
抽象成概念:程序。
1.2程序和程式的區別
程式是程式,程序是程序,程式不執行,永遠不是程序
程式:一堆程式碼
程序:程式執行的過程(小的資源集)
程序即程式(軟體)在一個數據集上的一次動態執行過程。程序是對正在執行程式的一個抽象。程序一般由程式、資料集、程序控制塊三部分組成。一個程序是一份獨立的記憶體空間,多個程序間使用者程式無法互相操作。

程式:我們編寫的程式用來描述程序要完成哪些功能以及如何完成
資料集:是程式執行過程中所需要使用的資源
程序控制塊:用來記錄程序的外部特徵,描述晉城的執行變化過程,系統可以利用它來控制和管理程序,他是系統感知程序存在的唯一標誌。
1.3什麼是執行緒?
**程序只是用來把資源集中到一起(程序只是一個資源單位,或者資源集合),而執行緒才是CPU上的執行單位。**在作業系統中,每個程序有一個地址空間,而且預設就有一個控制執行緒(主執行緒)。多執行緒就是多個控制執行緒的概念是,在一個程序中存在多個控制執行緒,多個控制執行緒共享該程序的地址空間。執行緒不能單獨存在,只能依附於程序中。一個執行緒可以建立和撤銷另一個執行緒(子執行緒),同一個程序中的多個執行緒之間可以併發執行。

1.4併發和並行
1.4.1併發(序列)
在這裡插入圖片描述
併發:系統具有處理多個任務的能力
並行:系統具有同時處理多個任務的能力
並行一定是併發,併發不一定是並行

1.4.2並行
1.5同步和非同步
1.5.1同步
所有操作都做完,才返回給使用者,這樣使用者線上等待的時間太長,給使用者一種卡死的感覺。這種情況下,使用者不能關閉介面, 如果關閉了,即遷移程式就中斷了。
在這裡插入圖片描述
1.5.2非同步
將使用者請求放入訊息佇列,並反饋給使用者友好提示,系統遷移程式啟動,你可以關閉瀏覽器了。然後程式在慢慢地去寫入資料庫去。這就是非同步。使用者沒有卡死的感覺。
1.5.3總結
同步,是所有操作都做完,才返回給使用者結果。即寫完資料庫之後,在響應使用者,使用者體驗不好。
非同步,不用等所有操作都做完,就響應使用者請求。即先響應使用者請求,然後慢慢去寫資料庫,使用者體驗較好。
在這裡插入圖片描述
為了避免短時間大量的資料庫操作,可以使用緩衝機制,也就是訊息佇列。現將資料放入訊息佇列,然後再慢慢寫入資料庫。
引入訊息佇列機制,對然可以保護使用者請求的快速響應,但是並沒有是的我資料遷移的時間變短,即80萬資料寫入mysql要一小時,用了緩衝機制,還是要1小時。只是保證使用者請求的快速響應,使用者輸入完http url請求後,就可以吧瀏覽器關閉了,幹別的去了。如果不用緩衝機制,瀏覽器不能關閉,
同步就沒價值了嗎?
有。比如銀行的轉賬功能,打電話等。
1.6面試題:有了程序為什麼還需要執行緒?
程序的開銷是執行緒的30倍左右
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述