摘要:StampedLock是一種在讀取共用變數的過程中,允許後面的一個線程獲取寫鎖對共用變數進行寫操作,使用樂觀讀避免數據不一致的問題,並且在讀多寫少的高併發環境下,比ReadWriteLock更快的一種鎖。 本文分享自華為雲社區《一文徹底理解併發編程中非常重要的票據鎖——StampedLock》 ...
目錄
1. 進程和線程的概念
進程:
- 系統正在運行的一個應用程式;程式一旦運行就是一個進程;進程是資源分配的最小單位
線程:
- 是進程的實際運行單位;一個人進程可以併發控制多個線程,每條線程並行執行不同的任務
區別:
- 進程基本上相互獨立的;而線程存在於進程內,是進程的一個子集
- 進程擁有共用的資源,如記憶體空間等,供其內部的線程共用
- 進程間通信較為複雜(同一臺電腦的進程通信稱為 IPC,不同電腦之間的進程通信,需要通過網路,並遵守共同的協議,例如 HTTP)
- 線程通信相對簡單,因為它們共用進程內的記憶體,一個例子是多個線程可以訪問同一個共用變數
- 線程更輕量,線程上下文切換成本一般上要比進程上下文切換低
2. 併發和並行的概念
併發:
- 兩個或多個事件在同一時間間隔發生
- 例: 家庭主婦做飯、打掃衛生、給孩子喂奶,她一個人輪流交替做這多件事,這時就是併發
並行:
- 並行是指兩個或者多個事件在同一時刻發生
- 例: 家庭主婦雇了個保姆,她們一起做這些事,這時既有併發,也有並行(這時會產生競爭,例如鍋只有一口,一個人用鍋時,另一個人就得等待)雇了3個保姆,一個專做飯、一個專打掃衛生、一個專喂奶,互不幹擾,這時是並行
3. 非同步和同步的概念
同步:
- 需要等待結果返回,才能繼續運行就是同步
非同步:
- 不需要等待結果返回,就能繼續運行就是非同步
總結
- 單核 cpu 下,多線程不能實際提高程式運行效率,只是為了能夠在不同的任務之間切換,不同線程輪流使用cpu ,不至於一個線程總占用 cpu,別的線程沒法幹活
- 多核 cpu 可以並行跑多個線程,但能否提高程式運行效率還是要分情況的
- IO 操作不占用 cpu,但是會堵塞線程; 只是我們一般拷貝文件使用的是【阻塞 IO】,這時相當於線程雖然不用 cpu,但需要一直等待 IO 結束,沒能充分利用線程。所以才有後面的【非阻塞 IO】和【非同步 IO】優化JUC併發編程第二章之CompletableFuture[加強版的線程]