Java JUC包概述

Java 的?java.util.concurrent(簡稱 JUC)包是 JDK 5 及以后引入的并發編程工具包,旨在解決傳統線程模型(如?synchronizedwait/notify)的局限性,提供更靈活、高效、可擴展的并發編程組件。它極大簡化了多線程開發,是 Java 并發編程的核心工具。

一、JUC 包的核心作用

傳統并發編程依賴?synchronized?關鍵字和?Object?的?wait()/notify()?方法,存在靈活性低(鎖無法中斷、無法超時)、效率有限(重量級鎖)等問題。JUC 包通過以下方式改進:

  • 提供更細粒度的同步控制(如可中斷鎖、超時鎖);
  • 內置線程池管理,避免頻繁創建銷毀線程的開銷;
  • 提供線程安全的并發集合(替代?HashMap?等線程不安全的集合);
  • 封裝常用并發工具(如計數器、信號量),減少重復開發。

二、JUC 核心組件分類

JUC 包內容豐富,可分為以下幾大模塊:

1. 線程池框架(Executor 體系)

線程池是管理線程的容器,避免頻繁創建 / 銷毀線程的性能損耗,核心接口和類如下:

  • Executor:最頂層接口,定義了?execute(Runnable)?方法,用于執行任務。
  • ExecutorService:繼承?Executor,增加了線程池生命周期管理(如?shutdown()?關閉線程池、submit()?提交帶返回值的任務)。
  • ThreadPoolExecutor:線程池的核心實現類,需關注 7 個核心參數:
    • corePoolSize:核心線程數(始終存活的線程);
    • maximumPoolSize:最大線程數(核心線程 + 臨時線程的上限);
    • keepAliveTime:臨時線程空閑時的存活時間;
    • workQueue:任務等待隊列(核心線程滿時,新任務進入隊列);
    • threadFactory:創建線程的工廠;
    • handler:任務拒絕策略(隊列和最大線程都滿時的處理方式)。
  • Executors:線程池工具類,提供便捷的線程池創建方法(如?newFixedThreadPool?固定大小線程池、newCachedThreadPool?緩存線程池),但實際開發中建議直接使用?ThreadPoolExecutor?自定義參數(避免資源耗盡風險)。
2. 并發集合(線程安全的容器)

傳統集合(如?HashMapArrayList)線程不安全,JUC 提供了專門的并發集合,解決多線程讀寫安全問題:

并發集合類對應傳統集合特點與適用場景
ConcurrentHashMapHashMap線程安全的哈希表,JDK 1.8 用?CAS + synchronized?實現(替代分段鎖),支持高并發讀寫。
CopyOnWriteArrayListArrayList讀寫分離,寫操作時復制底層數組,適合讀多寫少場景(如配置緩存)。
CopyOnWriteArraySetHashSet基于?CopyOnWriteArrayList?實現,原理同上。
ConcurrentLinkedQueueLinkedList(隊列)無鎖并發隊列,基于 CAS 實現,適合高并發場景的隊列操作。
BlockingQueue-阻塞隊列,提供?put()(滿時阻塞)和?take()(空時阻塞)方法,常用于生產者 - 消費者模型。實現類有?ArrayBlockingQueueLinkedBlockingQueue?等。
3. 同步工具類(控制線程協作)

用于協調多個線程的執行順序或資源訪問,核心工具包括:

  • Lock 與 Condition:替代?synchronized?和?wait()/notify()?的更靈活同步方式。

    • Lock?接口:定義?lock()(獲取鎖)、tryLock(long, TimeUnit)(超時獲取鎖)、unlock()(釋放鎖)等方法,實現類?ReentrantLock(可重入鎖)是最常用的。
    • Condition:通過?Lock.newCondition()?創建,提供?await()(等待)、signal()(喚醒單個)、signalAll()(喚醒所有),可實現多個條件隊列(比?Object?的單一等待隊列更靈活)。
  • Semaphore(信號量):控制同時訪問資源的線程數,類似 “許可證” 機制。例如:

    Semaphore semaphore = new Semaphore(3); // 允許3個線程同時訪問
    semaphore.acquire(); // 獲取許可證(若滿則阻塞)
    // 訪問資源...
    semaphore.release(); // 釋放許可證
    
  • CountDownLatch(倒計時器):等待多個線程完成后再執行主線程。例如:

    CountDownLatch latch = new CountDownLatch(5); // 計數5
    // 子線程執行完后調用 latch.countDown();(計數-1)
    latch.await(); // 主線程阻塞,直到計數為0
    
  • CyclicBarrier(循環屏障):讓多個線程到達 “屏障” 后等待,全部到達后一起繼續執行(可重復使用)。例如:

    CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有線程就緒,開始執行"));
    // 每個線程執行到 barrier.await() 時等待,直到3個線程都到達
    
4. 原子類(Atomic 系列)

基于 CAS(Compare-And-Swap,比較并交換)操作,提供線程安全的原子性變量更新,避免使用?synchronized?的開銷。核心類:

  • 基本類型:AtomicIntegerAtomicLongAtomicBoolean(提供?getAndIncrement()?原子自增等方法)。
  • 引用類型:AtomicReference(原子更新對象引用)、AtomicStampedReference(解決 CAS 的 ABA 問題,帶版本號)。
  • 數組類型:AtomicIntegerArray(原子更新數組元素)。

示例:

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 原子自增(替代 count++,線程安全)

5. 其他重要組件
  • Future 與 CallableCallable?是帶返回值的任務(類似?Runnable?但有返回值),Future?用于獲取?Callable?的執行結果。FutureTask?是?Future?的實現類,可包裝?Callable?并作為任務提交給線程池。
  • AQS(AbstractQueuedSynchronizer):JUC 許多組件的底層基礎(如?ReentrantLockSemaphore),通過維護一個 “同步狀態” 和 “雙向阻塞隊列” 實現同步控制,核心是?acquire()(獲取資源)和?release()(釋放資源)。

三、JUC 的核心優勢

  1. 更高的靈活性:如?Lock?支持超時、中斷,Condition?支持多條件等待。
  2. 更好的性能:如?ConcurrentHashMap?比?Hashtable?效率更高,原子類基于 CAS 避免鎖開銷。
  3. 更豐富的功能:內置線程池、阻塞隊列、信號量等工具,簡化并發編程。

總結

JUC 包是 Java 并發編程的 “瑞士軍刀”,涵蓋了線程管理、同步控制、并發容器等核心能力。掌握 JUC 組件的原理和適用場景,能有效解決多線程開發中的安全性、性能和可維護性問題,是中高級 Java 開發者的必備知識。

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

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

相關文章

LeetCode--44.通配符匹配

前言:不知不覺又斷更一天了,其實昨天就把這道題寫得差不多了,只是剛好在力扣里面看見了一種新的解法,本來想寫出來的,但是我把它推到今天了,因為太晚了,但是今天又睡懶覺了,所以我直…

WHAT - 依賴管理工具 CocoaPods

文章目錄1. 什么是 CocoaPods?2. 如何安裝 CocoaPods?(1) 確保已安裝 Ruby(macOS 默認自帶)(2) 安裝 CocoaPods(3) 驗證安裝3. 在 React Native 項目中使用 CocoaPods(1) 進入 iOS 目錄(2) 初始化 Podfile(如果不存在&…

C++ Boost Aiso TCP 網絡聊天(服務端客戶端一體化)

代碼功能說明: 程序模式: 主動連接模式:當用戶指定對端 IP 和端口時,嘗試連接到對端被動監聽模式:當用戶未指定對端 IP 時,等待其他節點連接線程模型: 主線程:處理用戶輸入和消息發送接收線程:后臺接收并顯示對端消息關鍵組件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45獵人寶寶狼 技能恢復宏已知3.45BUG RL技能位會清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修復以前可用宏一鍵恢復狀態-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…

對于編寫PID過程中的問題

當stm32RCT6使用位置環pid控制麥輪轉動一定路程時&#xff0c;在這個時間段內想讓一邊輪胎速度加大應該怎么做&#xff1f;比如我pid的目標脈沖值為9000&#xff0c;在運行到3000的時候車偏左了&#xff0c;那我應該怎樣讓他回正&#xff0c;我想到的辦法是增加其最大的脈沖值&…

LeetCode|Day13|88. 合并兩個有序數組|Python刷題筆記

LeetCode&#xff5c;Day13&#xff5c;88. 合并兩個有序數組&#xff5c;Python刷題筆記 &#x1f5d3;? 本文屬于【LeetCode 簡單題百日計劃】系列 &#x1f449; 點擊查看系列總目錄 >> &#x1f4cc; 題目簡介 題號&#xff1a;88. 合并兩個有序數組 難度&#xf…

【C++】初識C++(1)

個人主頁&#xff1a;我要成為c嘎嘎大王 希望這篇小小文章可以讓你有所收獲&#xff01; 目錄 前言 一、C的第一個程序 二、命名空間 2.1 namespace 的價值 2.2 namespace 的定義 2.2.1 正常的命名空間定義 2.2.2 命名空間可以嵌套 2.2.3 匿名命名空間 2.2.4 同名的name…

在新聞資訊 APP 中添加不同新聞分類頁面,通過 ViewPager2 實現滑動切換

在新聞資訊 APP 中添加不同新聞分類頁面&#xff0c;通過 ViewPager2 實現滑動切換 核心組件的作用 ViewPager2&#xff1a;是 ViewPager 的升級版&#xff0c;基于RecyclerView實現&#xff0c;支持水平 / 垂直滑動、RTL&#xff08;從右到左&#xff09;布局&#xff0c;且修…

vuex操作state為什么要使用mutations作為規范而不是直接修改state

1. 狀態變更的可追蹤性 (Trackable Changes)Devtools 集成&#xff1a;Vue Devtools 可以捕獲每次 mutation 的執行記錄&#xff0c;記錄變更前后的 state 快照、參數和調用棧。直接修改 state&#xff1a;Devtools 無法檢測到變更來源&#xff0c;導致調試困難&#xff08;如無…

Spring AI 系列之九 - RAG-入門

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

【數據結構】基于順序表的通訊錄實現

目錄 1 順序表的概念及結構 1.1 線性表 1.2 順序表分類 1.2.1 靜態順序表 1.2.2 動態順序表 2 順序表的實現 2.1 順序表的初始化 2.2 順序表中數據的增加和修改 2.2.1 順序表的頭插 2.2.2 順序表的尾插 2.2.3 順序表的頭刪 2.2.4 順序表的尾刪 2.2.5 順序表指定位置…

C語言與匯編混合編程

一、GCC 擴展語法與MSVC約束 &#xff08;一&#xff09;GCC&#xff08;GNU Compiler Collection&#xff09;內聯匯編語法 asm("匯編指令");#或者 __asm__("匯編指令");#使用更復雜的語法來指定輸入、輸出操作數和修改的寄存器&#xff1a; asm volatile…

WPF中的ListBox詳解

文章目錄簡介ListBoxItem選中項目動態列表簡介 【ListBox】是列表控件&#xff0c;其內部可包含多個【ListBoxItem】&#xff0c;用戶可以從列表中選擇一個或多個項&#xff0c;若Item個數超過指定高度&#xff0c;則右側會自動出現滾動條&#xff0c;非常便捷。盡管邏輯上來說…

【歷史人物】【李白】生平事跡

目錄 一、李白個人簡歷 二、個人主要經歷 三、個人成就及影響 1、詩 2、詞 3、書法 4、劍術 5、理想 四、歷史評價 五、趣事 1、李白擱筆 2、贈汪倫 一、李白個人簡歷 基本信息? 姓名&#xff1a;李白&#xff0c;字太白&#xff0c;號青蓮居士 性別&#xff1…

HALCON+PCL混合編程

HALCON與PCL的混合編程基礎 HALCON和PCL(Point Cloud Library)都是處理3D數據的強大工具&#xff0c;但它們有著不同的設計目標和數據結構。HALCON專注于機器視覺應用&#xff0c;提供了豐富的圖像處理和分析功能&#xff1b;而PCL則是專門為點云處理設計的開源庫。 要實現兩者…

JavaScript書寫基礎和基本數據類型

JavaScript書寫基礎和基本數據類型 jarringslee js書寫基礎和規范 js是一種在客戶端&#xff08;瀏覽器&#xff09;運行的編程語言&#xff0c;可實現人機交互的效果。js組成&#xff1a; js由兩部分組成&#xff1a; ECMAScript&#xff1a;js的語言基礎&#xff0c;js遵循其…

CSS個人筆記分享【僅供學習交流】

1、調整透明度 .text{ background-color: rgba(0, 0, 0, 0.08); }解釋&#xff1a;rgba&#xff08;rgb三元素&#xff0c;透明度取值從0~1&#xff09; 2、文字和圖片對齊方式 長用于頭像旁邊的昵稱居中顯示<img src"img/hua" alt"">華仔</img&g…

24.找到列表中最大或最小值的索引

找到列表中最大或最小值的索引 在 Python 中,如果你想找出某個列表中最小或最大值的位置(索引),你可以通過兩步快速實現: 使用 min() 或 max() 獲取目標值使用 .index() 獲取目標值在列表中的索引位置? 基礎實現 def min_element_index(arr):return arr.index(min(arr)

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘pandas’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘pandas’問題 摘要 在使用 PyCharm 的 Python 控制臺或終端執行 pip install pandas 后&#xff0c;仍然出現 ModuleNotFoundError: No module named ‘pandas…

【env環境】rtthread5.1.0使用fal組件

配置 board/Kconfigconfig BSP_USING_ON_CHIP_FLASHbool "Enable On Chip Flash"default ncp rt-thread/components/fal/samples/porting/fal_cfg.h board/fal_cfg.h /** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.…