Java JUC(java.util.concurrent
)是Java并發編程的核心工具包,提供了豐富的并發工具類和框架。以下是JUC的主要知識點,按難易程度分類,供你參考:
1. 基礎概念與工具類
1.1 并發與并行(易)
-
內容:理解并發(Concurrency)和并行(Parallelism)的區別。
-
重要性:基礎概念,理解并發編程的前提。
1.2 線程與線程池(中)
-
內容:線程的創建與啟動(
Thread
、Runnable
)。線程池(ExecutorService
、ThreadPoolExecutor
)。線程池參數(核心線程數、最大線程數、隊列類型、拒絕策略)。 -
重要性:線程池是并發編程的核心工具,必須掌握。
1.3 線程生命周期與狀態(易)
-
內容:線程的6種狀態(
NEW
、RUNNABLE
、BLOCKED
、WAITING
、TIMED_WAITING
、TERMINATED
)。 -
重要性:理解線程狀態是調試并發問題的基礎。
2. 同步與鎖
2.1?synchronized
關鍵字(易)
-
內容:方法同步與代碼塊同步。鎖的粒度與性能優化。
-
重要性:最基礎的同步機制。
2.2?ReentrantLock
(中)
-
內容:可重入鎖的基本使用。公平鎖與非公平鎖。
tryLock
、lockInterruptibly
等高級特性。 -
重要性:比
synchronized
更靈活的鎖機制。
2.3?ReadWriteLock
(中)
-
內容:讀寫鎖(
ReentrantReadWriteLock
)。讀鎖與寫鎖的分離。 -
重要性:適用于讀多寫少的場景。
2.4?StampedLock
(難)
-
內容:樂觀讀鎖與悲觀讀鎖。鎖的升級與降級。
-
重要性:高性能鎖,適用于特定場景。
3. 原子操作類
3.1?AtomicInteger
、AtomicLong
等(易)
-
內容:原子操作的基本使用。
compareAndSet
(CAS)原理。 -
重要性:無鎖編程的基礎。
3.2?AtomicReference
、AtomicStampedReference
(中)
-
內容:引用類型的原子操作。解決ABA問題。
-
重要性:適用于復雜對象的原子操作。
3.3?LongAdder
、DoubleAdder
(中)
-
內容:高并發場景下的累加器。分段鎖機制。
-
重要性:比
AtomicLong
性能更高。
4. 并發集合
4.1?ConcurrentHashMap
(中)
-
內容:分段鎖與CAS機制。高并發下的性能優化。
-
重要性:最常用的并發集合。
4.2?CopyOnWriteArrayList
、CopyOnWriteArraySet
(易)
-
內容:寫時復制機制。適用場景與性能特點。
-
重要性:適用于讀多寫少的場景。
4.3?BlockingQueue
及其實現類(中)
-
內容:
ArrayBlockingQueue
、LinkedBlockingQueue
。PriorityBlockingQueue
、SynchronousQueue
。put
、take
等阻塞操作。 -
重要性:生產者-消費者模型的實現基礎。
4.4?ConcurrentLinkedQueue
、ConcurrentSkipListMap
(難)
-
內容:無鎖隊列與跳表。高并發場景下的性能優勢。
-
重要性:適用于高性能無鎖場景。
5. 同步工具類
5.1?CountDownLatch
(易)
-
內容:等待多個線程完成任務。
-
重要性:多線程協作的基礎工具。
5.2?CyclicBarrier
(中)
-
內容:多線程到達屏障后繼續執行。與
CountDownLatch
的區別。 -
重要性:適用于分階段任務。
5.3?Semaphore
(中)
-
內容:控制并發線程數。信號量的基本使用。
-
重要性:資源池管理的核心工具。
5.4?Phaser
(難)
-
內容:多階段任務同步。動態調整參與線程數。
-
重要性:適用于復雜任務調度。
5.5?Exchanger
(難)
-
內容:線程間數據交換。
-
重要性:適用于特定場景。
6. 異步編程
6.1?Future
與FutureTask
(中)
-
內容:異步任務的結果獲取。
get
方法的阻塞特性。 -
重要性:異步編程的基礎。
6.2?CompletableFuture
(難)
-
內容:鏈式調用與組合操作。
thenApply
、thenAccept
、thenCombine
等方法。 -
重要性:現代異步編程的核心工具。
7. 線程調度與定時任務
7.1?ScheduledExecutorService
(中)
-
內容:定時任務與周期性任務。
-
重要性:替代
Timer
的推薦工具。
7.2?ForkJoinPool
(難)
-
內容:分治算法與工作竊取。
RecursiveTask
與RecursiveAction
。 -
重要性:適用于計算密集型任務。
8. 其他高級特性
8.1?ThreadLocal
(中)
-
內容:線程本地變量。內存泄漏問題。
-
重要性:線程間數據隔離的工具。
8.2?AQS
(AbstractQueuedSynchronizer)(難)
-
內容:同步器的底層實現。自定義鎖與同步工具。
-
重要性:理解JUC底層機制的關鍵。
8.3 內存模型與volatile
(中)
-
內容:可見性、有序性、原子性。
happens-before
原則。 -
重要性:理解并發編程的基礎。
學習建議
-
從易到難:先掌握基礎概念和工具類,再深入學習高級特性。
-
動手實踐:通過編寫代碼加深理解,尤其是并發集合和同步工具類。
-
閱讀源碼:特別是
AQS
、ConcurrentHashMap
等核心類的源碼。 -
調試與測試:使用工具(如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 線程生命周期與狀態
描述:
-
線程狀態:
NEW
、RUNNABLE
、BLOCKED
、WAITING
、TIMED_WAITING
、TERMINATED
。 -
適用范圍:調試和分析線程行為。
-
注意點:線程狀態是 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快速開發平臺