苑 Java 學(xué)習(xí) Day14|多線程入門、線程同步思維導(dǎo)圖復(fù)盤)
一、思維導(dǎo)圖整體知識(shí)結(jié)構(gòu)梳理本次學(xué)習(xí)內(nèi)容分為四大核心模塊多線程基礎(chǔ)概念、多線程三種實(shí)現(xiàn)方式、線程安全與同步機(jī)制、Lock 鎖與 Lambda 簡(jiǎn)化寫法是 Java 并發(fā)編程入門核心內(nèi)容。一多線程基本概念進(jìn)程操作系統(tǒng)獨(dú)立資源分配單位一個(gè)運(yùn)行中的軟件就是一個(gè)進(jìn)程線程進(jìn)程內(nèi)獨(dú)立執(zhí)行路徑是 CPU 調(diào)度最小單位一個(gè)進(jìn)程可包含多條線程并發(fā) / 并行并發(fā)是 CPU 快速輪換執(zhí)行多個(gè)線程宏觀同時(shí)、微觀交替并行是多核 CPU 同時(shí)執(zhí)行多條線程。二多線程三種實(shí)現(xiàn)方式繼承 Thread 類自定義類繼承Thread重寫run()方法new 對(duì)象.start()啟動(dòng)線程缺點(diǎn)Java 單繼承無(wú)法再繼承其他類耦合度高。實(shí)現(xiàn) Runnable 接口推薦實(shí)現(xiàn)Runnable重寫run()傳入 Thread 構(gòu)造器啟動(dòng)優(yōu)點(diǎn)避免單繼承限制、同一個(gè)任務(wù)可被多個(gè)線程共用資源共享更方便。實(shí)現(xiàn) Callable 接口 FutureTask支持線程返回值、拋出異常可通過(guò)get()獲取執(zhí)行結(jié)果適合需要拿到線程執(zhí)行返回?cái)?shù)據(jù)的場(chǎng)景。線程常用 APIstart()真正開啟線程由 JVM 調(diào)用 run 方法Thread.currentThread()獲取當(dāng)前執(zhí)行線程對(duì)象setPriority()設(shè)置線程優(yōu)先級(jí)僅為調(diào)度建議不絕對(duì)生效sleep()讓線程休眠指定毫秒釋放 CPU 執(zhí)行權(quán)getName()/setName()獲取 / 設(shè)置線程名稱。三線程安全問(wèn)題問(wèn)題根源多條線程同時(shí)操作共享臨界資源CPU 切換執(zhí)行導(dǎo)致指令被拆分出現(xiàn)數(shù)據(jù)錯(cuò)亂典型案例售票超賣、剩余票數(shù)負(fù)數(shù)解決核心思路保證共享資源同一時(shí)間只允許一條線程執(zhí)行即原子性操作通過(guò)加鎖實(shí)現(xiàn)線程互斥。四線程同步方案1. synchronized 同步鎖隱式鎖同步代碼塊synchronized(鎖對(duì)象){ 操作共享資源代碼 }鎖對(duì)象任意唯一對(duì)象粒度更細(xì)同步方法方法上加synchronized修飾非靜態(tài)鎖為this 當(dāng)前對(duì)象靜態(tài)鎖為類字節(jié)碼對(duì)象 Class 底層自動(dòng)完成鎖獲取與釋放出現(xiàn)異常會(huì)自動(dòng)釋放鎖不會(huì)死鎖。2. Lock 鎖顯式鎖java.util.concurrent.locks手動(dòng)創(chuàng)建ReentrantLock可重入鎖對(duì)象手動(dòng) lock () 加鎖、finally 塊中 unlock () 釋放鎖 優(yōu)勢(shì)靈活性更高、可嘗試非阻塞獲取鎖、公平鎖 / 非公平鎖可配置鎖粒度控制更精準(zhǔn)。五Lambda 表達(dá)式簡(jiǎn)化線程代碼因?yàn)镽unnable是函數(shù)式接口僅一個(gè)抽象方法可以用 Lambda 一行簡(jiǎn)化線程創(chuàng)建java運(yùn)行new Thread(() - { // 線程執(zhí)行任務(wù) }).start();大幅精簡(jiǎn)匿名內(nèi)部類冗余代碼也是函數(shù)式編程入門實(shí)踐。二、思維導(dǎo)圖制作與分享意圖1. 個(gè)人知識(shí)點(diǎn)梳理與易錯(cuò)點(diǎn)規(guī)避線程三種實(shí)現(xiàn)方式優(yōu)缺點(diǎn)、synchronized 鎖對(duì)象歸屬靜態(tài) / 非靜態(tài)、Lock 手動(dòng)鎖必須在 finally 釋放等都是高頻易錯(cuò)點(diǎn)。通過(guò)思維導(dǎo)圖層級(jí)拆解理清線程不安全產(chǎn)生本質(zhì)、兩套鎖機(jī)制區(qū)別避免售票案例超賣、死鎖、鎖未釋放等編碼 bug。2. 面試與項(xiàng)目實(shí)用價(jià)值多線程、并發(fā)安全、synchronized 與 Lock 對(duì)比是后端面試必考內(nèi)容也是實(shí)際項(xiàng)目異步任務(wù)、定時(shí)處理、高并發(fā)接口的基礎(chǔ)。這份導(dǎo)圖完整覆蓋線程創(chuàng)建、生命周期、同步加鎖方案可作為并發(fā)入門速查手冊(cè)。3. 課程體系承接邏輯前面反射、代理、注解、泛型夯實(shí) JavaSE 底層基礎(chǔ)本日進(jìn)入并發(fā)編程模塊屬于 Java 高階核心能力后續(xù)線程池、volatile、JMM、AQS 等內(nèi)容都建立在本次線程安全、鎖機(jī)制之上為高并發(fā)編程、框架底層原理理解鋪路。4. 思維導(dǎo)圖結(jié)構(gòu)化優(yōu)勢(shì)多線程概念抽象、鎖規(guī)則容易混淆樹形結(jié)構(gòu)按照「是什么→怎么創(chuàng)建→有什么問(wèn)題→怎么解決→代碼簡(jiǎn)化寫法」遞進(jìn)拆解清晰區(qū)分兩種鎖的使用場(chǎng)景與語(yǔ)法差異復(fù)習(xí)邏輯直觀清晰。三、當(dāng)日學(xué)習(xí)總結(jié)今天系統(tǒng)完成 Java 多線程入門學(xué)習(xí)理解進(jìn)程與線程區(qū)別掌握繼承 Thread、實(shí)現(xiàn) Runnable、CallableFutureTask三種線程創(chuàng)建方式熟練調(diào)用線程常用控制 API弄懂多線程并發(fā)操作共享資源導(dǎo)致線程不安全的底層原因?qū)W會(huì)使用synchronized同步代碼塊 / 同步方法、ReentrantLock顯式鎖兩種方案解決線程安全問(wèn)題最后利用 Lambda 表達(dá)式簡(jiǎn)化 Runnable 線程代碼體會(huì)函數(shù)式接口簡(jiǎn)化編程的優(yōu)勢(shì)。 并發(fā)編程是后端開發(fā)核心能力本次掌握線程基礎(chǔ)與鎖同步機(jī)制正式打開 Java 并發(fā)體系學(xué)習(xí)入口為后續(xù)線程池、鎖優(yōu)化、高并發(fā)問(wèn)題排查打下扎實(shí)基礎(chǔ)。