引言
為什么很多大廠喜歡問并發編程呢?因為并發編程是開發人員的一個分水嶺。很多好幾年開發經驗的開發人員可能也沒有實際的并發編程經驗,要么就是在一些沒有挑戰性的中臺實現了所謂的分布式鎖,但是沒有并發量去考驗,要么就是笑著說其實工作中用不上,這些開發人員后面會逐漸被AI淘汰,CURD的東西花這么多錢請你們干嘛呢?為什么不直接請個便宜的應屆生呢?鍛煉一兩年絕對不比這些開發人員差。因此,努力越過分水嶺,往架構組件的能力出發吧。這篇文章將會是你的出發點,這里會詳細介紹JDK 的并發包的原理及使用方法。1、JUC并發編程概述
J.U.C并發包,即JAVA.util.concurrent包,是JDK的核心工具包,是JDK1.5之后,由 Doug Lea實現并引入。整個java.util.concurrent包,按照功能可以大致劃分如下:
- juc-locks 鎖框架
- juc-atomic 原子類框架
- juc-sync 同步器框架、工具類
- juc-collections 集合框架
2、多線程基礎:進程、線程
多線程概念介紹- 進程:我們把運行中的程序叫做進程(概念)。每個進程都會占用內存與CPU資源(動態性)。進程與進程之間各自占用各自的內存資源,互相獨立(獨立性)。
- 線程:線程就是進程中的一個執行單元,負責當前進程中程序的執行。一個進程可以包含多個線程。一個進程包含了多個線程就是多線程。多線程可以提高程序的并行運行效率。
為什么使用多線程?
多線程有什么用?這里舉例說明:
比如看學習視頻時候:我們在看視頻的同時,還可以聽到聲音,還可以看到廣告以及彈幕,這里至少用到四個線程,當其中一個線程卡死如放不了彈幕不影響播放廣告。
如上圖,要達到并行執行的效果,這里就要用到多線程。
- 并行: 兩個或兩個以上的事件在同一時刻發生(同時發生)
- 并發: 兩個或兩個以上的事件在一個時間段內發生(交替執行)
計算機通常只有一個CPU時,在任意時刻只能執行一條計算機指令,每一個進程只有獲得CPU的使用權才能執行指令。所謂多進程并發運行,從宏觀上看,其實是各個進程輪流獲得CPU的使用權,分別執行各自的任務。那么,就會有多個線程處于就緒狀態等到CPU,JVM就負責了線程的調度。JVM采用的是搶占式調度,沒有采用分時調度,因此可能造成多線程執行結果的的隨機性。
說明:在單核CPU中,同一個時刻只有一個線程執行,根據CPU時間片算法依次為每個線程服務,這就叫線程調度。
3、多線程編程:wait()、notify()、notifyAll()
目標: 線程等待和喚醒使用。介紹
等待和喚醒:通常是兩個線程之間的事情,一個線程等待,另外一個線程負責喚醒
等待和喚醒
- wait() 等待
- notity() 喚醒單個
- notityAll() 喚醒全部