JUC相關知識點總結

Java JUC(java.util.concurrent)是Java并發編程的核心工具包,提供了豐富的并發工具類和框架。以下是JUC的主要知識點,按難易程度分類,供你參考:


1. 基礎概念與工具類

1.1 并發與并行(易)
  • 內容:理解并發(Concurrency)和并行(Parallelism)的區別。

  • 重要性:基礎概念,理解并發編程的前提。

1.2 線程與線程池(中)
  • 內容:線程的創建與啟動(ThreadRunnable)。線程池(ExecutorServiceThreadPoolExecutor)。線程池參數(核心線程數、最大線程數、隊列類型、拒絕策略)。

  • 重要性:線程池是并發編程的核心工具,必須掌握。

1.3 線程生命周期與狀態(易)
  • 內容:線程的6種狀態(NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED)。

  • 重要性:理解線程狀態是調試并發問題的基礎。


2. 同步與鎖

2.1?synchronized關鍵字(易)
  • 內容:方法同步與代碼塊同步。鎖的粒度與性能優化。

  • 重要性:最基礎的同步機制。

2.2?ReentrantLock(中)
  • 內容:可重入鎖的基本使用。公平鎖與非公平鎖。tryLocklockInterruptibly等高級特性。

  • 重要性:比synchronized更靈活的鎖機制。

2.3?ReadWriteLock(中)
  • 內容:讀寫鎖(ReentrantReadWriteLock)。讀鎖與寫鎖的分離。

  • 重要性:適用于讀多寫少的場景。

2.4?StampedLock(難)
  • 內容:樂觀讀鎖與悲觀讀鎖。鎖的升級與降級。

  • 重要性:高性能鎖,適用于特定場景。


3. 原子操作類

3.1?AtomicIntegerAtomicLong等(易)
  • 內容:原子操作的基本使用。compareAndSet(CAS)原理。

  • 重要性:無鎖編程的基礎。

3.2?AtomicReferenceAtomicStampedReference(中)
  • 內容:引用類型的原子操作。解決ABA問題。

  • 重要性:適用于復雜對象的原子操作。

3.3?LongAdderDoubleAdder(中)
  • 內容:高并發場景下的累加器。分段鎖機制。

  • 重要性:比AtomicLong性能更高。


4. 并發集合

4.1?ConcurrentHashMap(中)
  • 內容:分段鎖與CAS機制。高并發下的性能優化。

  • 重要性:最常用的并發集合。

4.2?CopyOnWriteArrayListCopyOnWriteArraySet(易)
  • 內容:寫時復制機制。適用場景與性能特點。

  • 重要性:適用于讀多寫少的場景。

4.3?BlockingQueue及其實現類(中)
  • 內容ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueueputtake等阻塞操作。

  • 重要性:生產者-消費者模型的實現基礎。

4.4?ConcurrentLinkedQueueConcurrentSkipListMap(難)
  • 內容:無鎖隊列與跳表。高并發場景下的性能優勢。

  • 重要性:適用于高性能無鎖場景。


5. 同步工具類

5.1?CountDownLatch(易)
  • 內容:等待多個線程完成任務。

  • 重要性:多線程協作的基礎工具。

5.2?CyclicBarrier(中)
  • 內容:多線程到達屏障后繼續執行。與CountDownLatch的區別。

  • 重要性:適用于分階段任務。

5.3?Semaphore(中)
  • 內容:控制并發線程數。信號量的基本使用。

  • 重要性:資源池管理的核心工具。

5.4?Phaser(難)
  • 內容:多階段任務同步。動態調整參與線程數。

  • 重要性:適用于復雜任務調度。

5.5?Exchanger(難)
  • 內容:線程間數據交換。

  • 重要性:適用于特定場景。


6. 異步編程

6.1?FutureFutureTask(中)
  • 內容:異步任務的結果獲取。get方法的阻塞特性。

  • 重要性:異步編程的基礎。

6.2?CompletableFuture(難)
  • 內容:鏈式調用與組合操作。thenApplythenAcceptthenCombine等方法。

  • 重要性:現代異步編程的核心工具。


7. 線程調度與定時任務

7.1?ScheduledExecutorService(中)
  • 內容:定時任務與周期性任務。

  • 重要性:替代Timer的推薦工具。

7.2?ForkJoinPool(難)
  • 內容:分治算法與工作竊取。RecursiveTaskRecursiveAction

  • 重要性:適用于計算密集型任務。


8. 其他高級特性

8.1?ThreadLocal(中)
  • 內容:線程本地變量。內存泄漏問題。

  • 重要性:線程間數據隔離的工具。

8.2?AQS(AbstractQueuedSynchronizer)(難)
  • 內容:同步器的底層實現。自定義鎖與同步工具。

  • 重要性:理解JUC底層機制的關鍵。

8.3 內存模型與volatile(中)
  • 內容:可見性、有序性、原子性。happens-before原則。

  • 重要性:理解并發編程的基礎。


學習建議

  1. 從易到難:先掌握基礎概念和工具類,再深入學習高級特性。

  2. 動手實踐:通過編寫代碼加深理解,尤其是并發集合和同步工具類。

  3. 閱讀源碼:特別是AQSConcurrentHashMap等核心類的源碼。

  4. 調試與測試:使用工具(如JConsole、VisualVM)分析并發問題。


通過系統學習以上知識點,你將全面掌握Java JUC的核心內容,并能夠應對實際開發中的并發編程挑戰。

詳細演示上面功能


Java JUC 知識點完整匯總


1. 基礎概念與工具類

1.1 并發與并行

描述

  • 并發:多個任務交替執行,適用于單核 CPU 或多線程任務。

  • 并行:多個任務同時執行,需要多核 CPU 支持。

  • 適用范圍:理解并發與并行的區別是并發編程的基礎。

  • 注意點:并行需要硬件支持(多核 CPU)。

  • 實現原理:并發通過線程切換實現,并行通過多核 CPU 實現。

代碼示例

public class ConcurrencyVsParallelism {public static void main(String[] args) {// 并發:多個任務交替執行Runnable task = () -> System.out.println(Thread.currentThread().getName() + " is running");new Thread(task).start(); // 啟動線程1new Thread(task).start(); // 啟動線程2// 并行:多個任務同時執行(需要多核CPU支持)ExecutorService executor = Executors.newFixedThreadPool(2); // 創建固定大小的線程池executor.submit(task); // 提交任務1executor.submit(task); // 提交任務2executor.shutdown(); // 關閉線程池}
}
1.2 線程與線程池

描述

  • 線程:Java 中最基本的并發單元。

  • 線程池:管理線程的生命周期,避免頻繁創建和銷毀線程。

  • 適用范圍:需要頻繁創建線程的場景。

  • 注意點:線程池參數(核心線程數、最大線程數、隊列類型、拒絕策略)需要合理配置。

  • 實現原理:線程池通過任務隊列和工作線程實現任務調度。

代碼示例

public class ThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2); // 創建固定大小的線程池executor.submit(() -> System.out.println("Task 1")); // 提交任務1executor.submit(() -> System.out.println("Task 2")); // 提交任務2executor.shutdown(); // 關閉線程池}
}
1.3 線程生命周期與狀態

描述

  • 線程狀態NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED

  • 適用范圍:調試和分析線程行為。

  • 注意點:線程狀態是 JVM 管理的,開發者無法直接控制。

  • 實現原理:JVM 通過內部狀態機管理線程狀態。

代碼示例

public class ThreadStateExample {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {try {Thread.sleep(1000); // TIMED_WAITING} catch (InterruptedException e) {e.printStackTrace();}});System.out.println(thread.getState()); // NEWthread.start();System.out.println(thread.getState()); // RUNNABLEthread.join();System.out.println(thread.getState()); // TERMINATED}
}

2. 同步與鎖

2.1?synchronized

描述

  • 適用范圍:簡單的線程同步場景。

  • 注意點:鎖的粒度要盡量小,避免性能問題。

  • 實現原理:基于 JVM 內置鎖機制,通過?monitorenter?和?monitorexit?指令實現。

代碼示例

public class SynchronizedExample {private static class Counter {private int count = 0;public synchronized void increment() {count++; // 臨界區操作}public int getCount() {return count;}}public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Runnable task = () -> {for (int i = 0; i < 1000; i++) {counter.increment(); // 調用同步方法}};Thread thread1 = new Thread(task); // 創建線程1Thread thread2 = new Thread(task); // 創建線程2thread1.start(); // 啟動線程1thread2.start(); // 啟動線程2thread1.join(); // 等待線程1完成thread2.join(); // 等待線程2完成System.out.println("Final count: " + counter.getCount()); // 輸出最終結果}
}
2.2?ReentrantLock

描述

  • 適用范圍:需要更靈活的鎖控制(如可中斷鎖、超時鎖)。

  • 注意點:必須手動釋放鎖,否則會導致死鎖。

  • 實現原理:基于?AQS(AbstractQueuedSynchronizer)實現。

代碼示例

import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private static class Counter {private int count = 0;private final ReentrantLock lock = new ReentrantLock(); // 創建 ReentrantLockpublic void increment() {lock.lock(); // 獲取鎖try {count++; // 臨界區操作} finally {lock.unlock(); // 釋放鎖}}public int getCount() {return count;}}public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Runnable task = () -> {for (int i = 0; i < 1000; i++) {counter.increment(); // 調用同步方法}};Thread thread1 = new Thread(task); // 創建線程1Thread thread2 = new Thread(task); // 創建線程2thread1.start(); // 啟動線程1thread2.start(); // 啟動線程2thread1.join(); // 等待線程1完成thread2.join(); // 等待線程2完成System.out.println("Final count: " + counter.getCount()); // 輸出最終結果}
}

3. 原子操作類

3.1?AtomicInteger

描述

  • 適用范圍:無鎖的線程安全計數器。

  • 注意點:適用于簡單的原子操作,復雜場景可能需要鎖。

  • 實現原理:基于 CAS(Compare-And-Swap)實現。

代碼示例

import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerExample {public static void main(String[] args) {AtomicInteger atomicInt = new AtomicInteger(0); // 初始化值為 0atomicInt.incrementAndGet(); // 原子操作:自增并返回新值atomicInt.addAndGet(5); // 原子操作:增加指定值并返回新值System.out.println("Final value: " + atomicInt.get()); // 輸出最終值}
}

4. 并發集合

4.1?ConcurrentHashMap

描述

  • 適用范圍:高并發場景下的鍵值對存儲。

  • 注意點:不支持?null?鍵和值。

  • 實現原理:分段鎖 + CAS 機制。

代碼示例

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); // 創建 ConcurrentHashMapmap.put("a", 1); // 插入鍵值對map.put("b", 2); // 插入鍵值對System.out.println("Value for key 'a': " + map.get("a")); // 獲取值}
}

5. 同步工具類

5.1?CountDownLatch

描述

  • 適用范圍:等待多個線程完成任務。

  • 注意點:計數器不能重置。

  • 實現原理:基于 AQS 實現。

代碼示例

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(2); // 初始化計數器為 2new Thread(() -> {System.out.println("Task 1 completed");latch.countDown(); // 計數器減 1}).start();new Thread(() -> {System.out.println("Task 2 completed");latch.countDown(); // 計數器減 1}).start();latch.await(); // 阻塞直到計數器為 0System.out.println("All tasks completed");}
}

6. 異步編程

6.1?Future

描述

  • 適用范圍:異步任務的結果獲取。

  • 注意點get()?方法會阻塞,直到任務完成。

  • 實現原理:基于?Runnable?和?Callable?實現。

代碼示例

import java.util.concurrent.*;public class FutureExample {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor(); // 創建單線程線程池Future<Integer> future = executor.submit(() -> 1 + 1); // 提交任務System.out.println("Task result: " + future.get()); // 獲取任務結果executor.shutdown(); // 關閉線程池}
}

7. 線程調度與定時任務

7.1?ScheduledExecutorService

描述

  • 適用范圍:定時任務和周期性任務。

  • 注意點:任務執行時間過長會影響后續任務。

  • 實現原理:基于線程池和任務隊列。

代碼示例

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledExecutorServiceExample {public static void main(String[] args) {ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // 創建調度線程池scheduler.schedule(() -> System.out.println("Task executed"), 1, TimeUnit.SECONDS); // 延遲執行scheduler.shutdown(); // 關閉線程池}
}

8. 其他高級特性

8.1?ThreadLocal

描述

  • 適用范圍:線程間數據隔離。

  • 注意點:可能導致內存泄漏,需要及時清理。

  • 實現原理:每個線程維護一個獨立的?ThreadLocalMap

代碼示例

public class ThreadLocalExample {private static final ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "Initial Value");public static void main(String[] args) {new Thread(() -> {threadLocal.set("Thread 1 Value"); // 設置線程本地變量System.out.println("Thread 1: " + threadLocal.get()); // 獲取線程本地變量}).start();new Thread(() -> {threadLocal.set("Thread 2 Value"); // 設置線程本地變量System.out.println("Thread 2: " + threadLocal.get()); // 獲取線程本地變量}).start();}
}


以上是 Java JUC 的完整知識點匯總,包含代碼示例、實現原理和注意點。如果需要進一步補充或調整,請隨時告訴我!

文章轉載自:佛祖讓我來巡山

原文鏈接:JUC相關知識點總結 - 佛祖讓我來巡山 - 博客園

體驗地址:JNPF快速開發平臺

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92110.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

激光頻率梳 3D 測量方案革新:攻克光學掃描遮擋,130mm 深孔測量精度達 2um

一、深孔測量的光學遮擋難題在精密制造領域&#xff0c;130mm 級深孔&#xff08;如航空發動機燃油孔、模具冷卻孔&#xff09;的 3D 測量長期受困于光學遮擋。傳統激光掃描技術依賴直射光束&#xff0c;當深徑比超過 10:1 時&#xff0c;孔壁中下部形成大量掃描盲區&#xff0…

clickhouse 中文數據的正則匹配

中文數據的正則匹配 在ClickHouse中,正則匹配通常用于數據的篩選、格式化等操作。以下是一些常用的正則匹配技巧: 1. 匹配中文字符 要匹配中文字符,可以使用以下正則表達式: SELECT * FROM my_table WHERE my_column REGEXP [\\x{4e00}-\\x{9fa5}];這里的 \\x{4e00}-\\…

[驅動開發篇] Can通信進階 --- CanFD 的三次采樣

驅動開發篇] Can通信進階 --- Can報文的三次采樣一、CAN FD的采樣次數1.1. 標準規定1.2. 傳統標準CAN采樣1.3. CAN FD的采樣策略1.3.1. 基礎采樣策略1.4. 配置位置1.5. 常見步驟二、CAN FD與標準CAN在采樣機制上的主要區別三、使用建議四. 芯片廠商實現4.1. 實際市面情況4.2. 例…

分布式文件系統06-分布式中間件彈性擴容與rebalance沖平衡

分布式中間件彈性擴容與rebalance沖平衡176_如果宕機的數據節點事后再次重啟會發生什么事情&#xff1f;某個之前某個宕機的數據節點DataNode-A又重啟后&#xff0c;肯定會再次注冊&#xff0c;并進行全量上報的流程&#xff0c;此時&#xff0c;就會導致DataNode-A上的文件副本…

芯祥科技:工業/車規級BMS芯片廠商 規格選型對比

芯祥科技公司專注于工業和車規級BMS芯片&#xff0c;電源芯片及可編程模擬芯片的研發與銷售&#xff0c;客戶遍及新能源儲能&#xff0c;汽車&#xff0c;電腦&#xff0c;服務器及電動工具等領域。并具有創業公司成功經驗&#xff0c;平均具有逾17年以上的芯片研發和市場銷售經…

莫隊基礎(Mo‘s algorithm)

莫隊算法簡介 莫隊算法是一種用于高效處理離線區間查詢問題的算法&#xff0c;由莫濤&#xff08;Mo Tao&#xff09;在2009年提出。其核心思想是通過對查詢區間進行分塊和排序&#xff0c;利用前一次查詢的結果來減少計算量&#xff0c;從而將時間復雜度優化至接近線性。 莫…

板卡兩個ADC,一個JESD204b sync正常,另一個JESD204B同步不上的問題

目錄 1.問題來源: 2.問題分析 進一步測試表現: 抓取204B高速鏈路數據如上所示。 說明不是配置流程的問題 1.問題來源: 在工控機上和部分電腦上面出現時鐘鎖不住的現象,無法正常使用板卡。 經過分析,發現板卡上有兩片ADC,其中一片的ADC的sync信號經過測量,是正常的,…

Android10 系統休眠調試相關

Android10 系統休眠調試相關實時打印休眠日志(實測好像沒作用)&#xff1a;echo 1 > /sys/module/printk/parameters/console_suspend查看喚醒鎖&#xff1a;cat sys/power/wake_lock msm8953_64:/ # cat sys/power/wake_lock PowerManager.SuspendLockout PowerManagerServ…

一文掌握Bard機器翻譯,以及用python調用的4種方式(現已升級為 Gemini)

文章目錄一、Bard機器翻譯概述1.1. Bard機器翻譯介紹1.2 Bard機器翻譯的核心特點1.3 技術背景1.4 與同類模型對比二、Bard機器翻譯案例2.1 官方 REST API&#xff08;推薦生產&#xff09;2.2 通過Google Cloud API調用2.3 私有化部署方案2.4 開源鏡像 PyBard&#xff08;無需 …

Kafka-Eagle 安裝

Kafka-Eagle官網 1&#xff09;上傳壓縮包 kafka-eagle-bin-2.0.8.tar.gz 到集群第一臺的/opt/modules 目錄 2&#xff09;解壓到本地 tar -zxvf kafka-eagle-bin-2.0.8.tar.gz 3&#xff09;將 efak-web-2.0.8-bin.tar.gz 解壓至/opt/installs cd kafka-eagle-bin-2.0.8 …

接口請求的后臺發起確認

場景講解做業務開發時經常遇到這些場景&#xff0c;在后端代碼執行命中了些業務規則&#xff0c;需要前端用戶確認一下再往下執行。示例1&#xff1a;后端判斷申請1筆超過5萬的資金時會發起監管流程&#xff0c;告訴前端操作用戶風險并詢問是否確認執行。示例2&#xff1a;數據…

完整學習MySQL

DML 等術語概念 DML&#xff08;Data Manipulation Language&#xff0c;數據操縱語言&#xff09;&#xff1a; DML主要用于插入、更新、刪除和查詢數據庫中的數據。常見的DML語句包括&#xff1a; INSERT&#xff1a;用于向表中插入新的數據行。UPDATE&#xff1a;用于修改…

大模型筆記1——李宏毅《2025機器學習》第一講

本篇筆記內容1、學習本節課需要的前置知識了解大模型的訓練過程&#xff1a;預訓練、后訓練、強化學習&#xff08;2024年生成式AI導論前8講&#xff09;了解基礎機器學習、深度學習概念&#xff08;如transformer&#xff09;&#xff08;2021年機器學習課程&#xff09;2、本…

CSS scrollbar-width:輕松定制滾動條寬度的隱藏屬性

在前端設計中&#xff0c;滾動條往往是一個容易被忽略的細節。默認的滾動條樣式常常與頁面設計格格不入&#xff0c;尤其是寬度 —— 過寬的滾動條會擠占內容空間&#xff0c;過窄又可能影響用戶操作。而 CSS 的scrollbar-width屬性&#xff0c;就像一把 “精細的尺子”&#x…

小迪23年-28~31-js簡單回顧

前端-js開發 課堂完結后欲復習鞏固也方便后續-重游-故寫此篇 從實現功能過渡到涉及的相關知識點 知識點 1、 JS 是前端語言&#xff0c;是可以被瀏覽器“看到”的&#xff0c;當然也可以被修改啊&#xff0c;被瀏覽器禁用網頁的 JS 功能啊之類的。所以一般都是前后端分離開發&…

JavaScript 概述

JavaScript 是一種高級、解釋型編程語言&#xff0c;主要用于網頁開發&#xff0c;使其具備動態交互功能。它是網頁三大核心技術之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;能夠直接嵌入 HTML 頁面并在瀏覽器中執行。核心特性動態弱類型語言 JavaScript 是…

Mermaid流程圖可視化系統:基于Spring Boot與Node.js的三層架構實現

什么是Mermaid?系統架構設計 三層架構 overview架構交互流程 核心組件詳解 1. Spring Boot后端2. Node.js中間層3. 前端界面 功能實現 1. 節點和關系管理2. 流程圖渲染3. 主題切換4. 導出功能 使用指南 啟動步驟頁面操作 總結與展望 什么是Mermaid? Mermaid流程圖可視化系統…

R 數據框:高效數據處理與分析的利器

R 數據框:高效數據處理與分析的利器 引言 在數據科學和統計分析領域,R語言因其強大的數據處理能力和豐富的統計模型而備受推崇。R數據框(data frame)是R語言中一種重要的數據結構,它以表格形式存儲數據,使得數據的組織、操作和分析變得簡單高效。本文將深入探討R數據框…

論文閱讀筆記:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》

論文閱讀筆記&#xff1a;《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》1.背景與動機2.核心貢獻3.方法詳解4.實驗結果與貢獻主體代碼算法整體邏輯CVPR25 github 一句話總結&#xff1a; CCFS基于組合范式&#xff08;軌跡匹配選擇真實圖像&…

【Linux系統】詳解,進程控制

前言&#xff1a; 上文我們講到了Linux中的虛擬空間地址&#xff0c;知道了一個進程對應一個虛擬地址空間&#xff0c;虛擬空間地址與物理地址之間通過頁表映射....【Linux】虛擬地址空間-CSDN博客 本文我們來講一講Linux系統是如何控制進程的&#xff01; 如果喜歡本期文章&am…