引言
為什么很多大廠喜歡問(wèn)并發(fā)編程呢?因?yàn)椴l(fā)編程是開(kāi)發(fā)人員的一個(gè)分水嶺。很多好幾年開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)人員可能也沒(méi)有實(shí)際的并發(fā)編程經(jīng)驗(yàn),要么就是在一些沒(méi)有挑戰(zhàn)性的中臺(tái)實(shí)現(xiàn)了所謂的分布式鎖,但是沒(méi)有并發(fā)量去考驗(yàn),要么就是笑著說(shuō)其實(shí)工作中用不上,這些開(kāi)發(fā)人員后面會(huì)逐漸被AI淘汰,CURD的東西花這么多錢請(qǐng)你們干嘛呢?為什么不直接請(qǐng)個(gè)便宜的應(yīng)屆生呢?鍛煉一兩年絕對(duì)不比這些開(kāi)發(fā)人員差。因此,努力越過(guò)分水嶺,往架構(gòu)組件的能力出發(fā)吧。這篇文章將會(huì)是你的出發(fā)點(diǎn),這里會(huì)詳細(xì)介紹JDK 的并發(fā)包的原理及使用方法。1、JUC并發(fā)編程概述
J.U.C并發(fā)包,即JAVA.util.concurrent包,是JDK的核心工具包,是JDK1.5之后,由 Doug Lea實(shí)現(xiàn)并引入。整個(gè)java.util.concurrent包,按照功能可以大致劃分如下:
- juc-locks 鎖框架
- juc-atomic 原子類框架
- juc-sync 同步器框架、工具類
- juc-collections 集合框架
2、多線程基礎(chǔ):進(jìn)程、線程
多線程概念介紹- 進(jìn)程:我們把運(yùn)行中的程序叫做進(jìn)程(概念)。每個(gè)進(jìn)程都會(huì)占用內(nèi)存與CPU資源(動(dòng)態(tài)性)。進(jìn)程與進(jìn)程之間各自占用各自的內(nèi)存資源,互相獨(dú)立(獨(dú)立性)。
- 線程:線程就是進(jìn)程中的一個(gè)執(zhí)行單元,負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行。一個(gè)進(jìn)程可以包含多個(gè)線程。一個(gè)進(jìn)程包含了多個(gè)線程就是多線程。多線程可以提高程序的并行運(yùn)行效率。
為什么使用多線程?
多線程有什么用?這里舉例說(shuō)明:
比如看學(xué)習(xí)視頻時(shí)候:我們?cè)诳匆曨l的同時(shí),還可以聽(tīng)到聲音,還可以看到廣告以及彈幕,這里至少用到四個(gè)線程,當(dāng)其中一個(gè)線程卡死如放不了彈幕不影響播放廣告。

如上圖,要達(dá)到并行執(zhí)行的效果,這里就要用到多線程。
- 并行: 兩個(gè)或兩個(gè)以上的事件在同一時(shí)刻發(fā)生(同時(shí)發(fā)生)
- 并發(fā): 兩個(gè)或兩個(gè)以上的事件在一個(gè)時(shí)間段內(nèi)發(fā)生(交替執(zhí)行)
計(jì)算機(jī)通常只有一個(gè)CPU時(shí),在任意時(shí)刻只能執(zhí)行一條計(jì)算機(jī)指令,每一個(gè)進(jìn)程只有獲得CPU的使用權(quán)才能執(zhí)行指令。所謂多進(jìn)程并發(fā)運(yùn)行,從宏觀上看,其實(shí)是各個(gè)進(jìn)程輪流獲得CPU的使用權(quán),分別執(zhí)行各自的任務(wù)。那么,就會(huì)有多個(gè)線程處于就緒狀態(tài)等到CPU,JVM就負(fù)責(zé)了線程的調(diào)度。JVM采用的是搶占式調(diào)度,沒(méi)有采用分時(shí)調(diào)度,因此可能造成多線程執(zhí)行結(jié)果的的隨機(jī)性。
說(shuō)明:在單核CPU中,同一個(gè)時(shí)刻只有一個(gè)線程執(zhí)行,根據(jù)CPU時(shí)間片算法依次為每個(gè)線程服務(wù),這就叫線程調(diào)度。
3、多線程編程:wait()、notify()、notifyAll()
目標(biāo): 線程等待和喚醒使用。介紹
等待和喚醒:通常是兩個(gè)線程之間的事情,一個(gè)線程等待,另外一個(gè)線程負(fù)責(zé)喚醒
等待和喚醒
- wait() 等待
- notity() 喚醒單個(gè)
- notityAll() 喚醒全部