詳解 Java 中的 CopyOnWriteArrayList

目錄

【1】CopyOnWriteArrayList 簡介

【2】核心原理

1.底層數據結構

2.寫時復制機制

【3】CopyOnWriteArrayList常用方法及實例

1.添加元素方法 add ()

2.獲取元素方法 get ()

3.刪除元素方法remove()

【4】優缺點分析

【5】適用場景

【6】總結


【1】CopyOnWriteArrayList 簡介

????????Copy-On-Write,是一種用于集合的并發訪問優化策略。它的基本思想是:當我們往一個集合容器中寫入元素時(添加、修改、刪除),并不會直接在集合容器中寫入,而是先將當前集合容器進行Copy,復制出一個新的容器,然后新的容器里寫入元素,寫入操作完成之后,再將原容器的引用指向新的容器

????????這種策略的優點是:實現對CopyOnWrite集合容器寫入操作時的線程安全,但同時并不影響進行并發的讀取操作。所以CopyOnWrite容器也是一種讀寫分離的思想。
????????從JDK1.5開始Java并發包里提供了兩個使用CopyOnWrite機制實現的并發集合容器,它們是CopyOnWriteArrayList和CopyOnWriteArraySet。

????????CopyOnWriteArrayList相當于線程安全的ArrayList,內部存儲結構采用Object[]數組,線程安全使用ReentrantLock實現,允許多個線程并發讀取,但只能有一個線程寫入。


【2】核心原理

1.底層數據結構

????????CopyOnWriteArrayList 的底層數據結構是一個數組,使用volatile關鍵字修飾以保證可見性:

2.寫時復制機制

CopyOnWriteArrayList 的核心思想是寫時復制(Copy-On-Write):

  • 當進行寫操作(添加、修改、刪除)時,首先復制一份當前的底層數組
  • 在復制的新數組上執行寫操作
  • 操作完成后,將底層數組的引用指向新數組

這種機制保證了讀操作永遠訪問的是一個穩定的數組,不需要加鎖。


【3】CopyOnWriteArrayList常用方法及實例

1.添加元素方法 add ()

????????添加新元素至集合時,會將當前數組Copy復制新數組,并將新元素添加至新數組,最后替換原數組。執行過程中,使用ReentrantLock加鎖,保證線程安全,避免多個線程復制數組。

public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;// 復制出新數組Object[] newElements = Arrays.copyOf(elements, len + 1);// 把新元素添加到新數組里newElements[len] = e;// 把原數組引用指向新數組setArray(newElements);return true;} finally {lock.unlock();}
}

2.獲取元素方法 get ()

????????根據指定下標,到原數組中讀取元素。讀取過程中不加鎖,允許多個線程并發讀取。但是如果讀取的時候,有其它線程同時向集合中添加新元素并未結束,get()方法仍然讀取到的是舊數據。

public E get(int index) {// 根據指定下標,從原數組中讀取元素return get(getArray(), index);
}private E get(Object[] a, int index) {return (E) a[index];
}

3.刪除元素方法remove()

????????刪除指定下標元素。根據指定下標,從原數組中,Copy復制其它元素至新數組,最后替換原數組。

public E remove(int index) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;E oldValue = get(elements, index);int numMoved = len - index - 1;if (numMoved == 0)// 復制原數組中,除最后一個元素以外的所有元素,至新數組setArray(Arrays.copyOf(elements, len - 1));else {// 復制原數組中,除刪除元素以外的所有元素,至新數組Object[] newElements = new Object[len - 1];System.arraycopy(elements, 0, newElements, 0, index);System.arraycopy(elements, index + 1, newElements, index,numMoved);setArray(newElements);}return oldValue;} finally {lock.unlock();}
}

【4】優缺點分析

  • 優點

    • 讀操作性能優異:讀操作無需加鎖,適合讀多寫少的場景

    • 迭代安全:迭代過程中不會拋出ConcurrentModificationException

    • 線程安全:通過寫時復制和鎖機制保證線程安全

  • 缺點

    • 內存占用:寫操作時需要復制整個數組,可能導致內存占用翻倍

    • 數據一致性:只能保證最終一致性,不能保證實時一致性

    • 寫操作性能差:每次寫操作都需要復制數組,開銷較大


【5】適用場景

CopyOnWriteArrayList 適用于以下場景:

  1. 讀多寫少的并發場景,如緩存、配置信息管理

  2. 需要避免迭代過程中ConcurrentModificationException的場景

  3. 數據量不大的場景(避免復制大數組帶來的性能開銷)

不適合的場景:

  1. 寫操作頻繁的場景

  2. 對數據實時一致性要求高的場景

  3. 存儲大量數據的場景


【6】總結

????????CopyOnWriteArrayList 通過獨特的寫時復制機制,在特定場景下提供了高效的并發處理能力。它不是萬能的,但是在讀多寫少的場景下,相比傳統的同步列表實現具有明顯的優勢。


????????感謝你花時間讀到這里~ 如果你覺得這篇內容對你有幫助,不妨點個贊讓更多人看到;如果有任何想法、疑問,或者想分享你的相關經歷,歡迎在評論區留言交流,你的每一條互動對我來說都很珍貴~ 我們下次再見啦!😊😊

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

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

相關文章

新手SEO優化快速起步教程

本教程專為SEO新手設計,幫助您快速上手優化工作。我們將一步步帶您了解基礎概念,包括高效挖掘關鍵詞的方法、內容優化的核心技巧,以及網站基礎設置的關鍵步驟。后續還會講解提升排名的實用策略、如何監控效果并進行調整,確保您能系…

Minecraft圖片搜索技巧

以下是更多專注 Minecraft 內容的高質量社區平臺,涵蓋建筑展示、模組/材質分享、實機截圖、藝術創作等方向,按類型分類整理:---一、國際知名綜合社區平臺 特點 鏈接 CurseForge 模組/材質/數據包第一倉庫,作者更新快,支…

數學建模-非線性規劃(NLP)

1-理論知識介紹應用2-基于matlab實現非線性規劃1)例1% 清除工作臺和命令行 clear;clc; x0[0 0 0]; A [-1 1 -1]; b 0; [x,value] fmincon(f1,x0,A,b,[],[],[],[],nonlfun1) function f f1(x)f x(1)^2x(2)^2x(3)^28; end function [c,ceq] nonlfun1(x)c [x(1)…

人工智能學習:什么是seq2seq模型

一、seq2seq模型 Seq2Seq(Sequence-to-Sequence)模型是一種用于處理序列轉換問題的深度學習模型,廣泛應用于機器翻譯、文本摘要、對話系統、語音識別等領域。Seq2Seq模型的核心思想是通過一個編碼器(Encoder)將輸入序列編碼為一個固定長度的上下文向量(Context Vector),…

生態 | 華院計算與深至科技達成戰略合作,攜手推動AI+醫學影像算法升級迭代

8月25日,華院計算技術(上海)股份有限公司(以下簡稱“華院計算”)與上海深至信息科技有限公司(以下簡稱“深至科技”)正式簽署戰略合作協議。雙方將秉持“優勢互補、資源共享、戰略協同、共同發展…

詳解MySQL環境變量配置及其在備份中的應用

正確配置MySQL環境變量是保障數據庫穩定運行和高效管理的基礎。這些變量涵蓋了從內存分配、連接設置到日志行為等方方面面,直接決定了數據庫的性能表現和功能特性。對于數據庫管理員而言,熟練掌握環境變量的配置,是進行性能調優和故障排查的必…

scikit-learn零基礎配置(含python、anaconda)

一、Anaconda環境搭建 1、關于Anaconda Anaconda 是一個非常 popular 的 Python 發行版,它不僅包含了 Python 語言本身,還預裝了眾多常用的科學計算庫,如 NumPy、Pandas、Matplotlib 等,能夠極大地方便用戶的開發和數據分析工作。…

RAG提示詞(日本語版)

RAG提示詞(日本語版) System Message # 知能型質問応答アシスタント(RAGシステムプロンプト)## 役割定義 あなたは「知能型質問応答アシスタント」として、提供されたコンテキスト情報に基づいてユーザーの質問に回答する専門的な…

qData 數據中臺【開源版】發布 1.0.5 版本,全面提升規則治理、非結構化數據處理與部署體驗

2025年9月3日 —— 企業級開源數據中臺 qData 開源版 正式發布 1.0.5 版本。本次更新聚焦 規則治理一體化、非結構化數據支持、以及開源版的體驗與部署優化,進一步提升規則復用能力、數據接入廣度與運維效率,幫助企業和開發者更輕松地構建高質量數據治理…

RecSys:用戶行為序列建模以及DIN、SIM模型

引言 在推薦系統中,用戶歷史行為序列是極其重要的信息源。用戶最近的點擊、點贊、收藏、轉發等行為能夠有效反映其即時興趣,無論是在召回、粗排還是精排階段,合理利用這些行為序列都能顯著提升推薦效果。本文將系統介紹用戶行為序列建模的幾…

QGIS二次開發01:環境配置-OSGeo4W鏡像

寫在前面: 本筆記根據多方資料整理而成,旨在為QGIS二次開發提供學習參考。內容僅供交流學習,歡迎共同探討。 一、關于QGIS QGIS 是一個功能強大的桌面GIS軟件本身,為用戶提供了圖形化界面(GUI)來進行地圖制…

對接旅游行業安全需求:旅游安全急救實訓室的功能構建與育人目標

隨著我國旅游行業的快速發展,游客安全需求日益凸顯,安全應急處置能力已成為旅游服務人才的核心競爭力。旅游安全急救實訓室作為旅游服務與管理專業中的重要教學場所,其功能構建與育人目標影響人才培養質量與行業安全水平。點擊獲取方案 一、行…

Typora處理markdown文件【給.md文檔加水印】

①文件→偏好設置→外觀→打開主題文件夾②在打開的文件夾中放入水印圖像③右鍵點擊github.css文件后,點擊編輯,進入編輯頁面④將代碼塊中內容粘貼到文件最后 更多效果請自行探索 #write::before {content: "CSDN果子當夜宵:bigxie.blog…

基于單片機的六足機器人控制系統設計

基于單片機的六足機器人控制系統設計摘 要本設計主要是基于單片機的六足機器人控制系統設計,綜合分析六足機器人的結構、步態和控制算法,結合云端服務器、WIFI 技術、藍牙技術、語音識別技術和手勢識別技術進行多種控制模式的設計,并提出不同…

RK3568 Trust

文章目錄1、環境介紹2、前言3、ARM TrustZone3.1、什么是ARM TrustZone3.2、cpu特權等級3.3、ARM Trusted Firmware4、Rockchip 平臺的 Trust4.1、實現機制4.2、啟動流程4.3、生命周期4.4、Trust 編譯打包流程分析5、總結1、環境介紹 硬件:飛凌ok3568-c開發板 軟件…

C語言數據結構——詳細講解《二叉樹與堆的基本概念》

C語言數據結構——詳細講解《二叉樹與堆的基本概念》前言一、樹的基礎概念1.1 為什么需要樹?1.2 樹的定義與結構1.3 樹的核心術語1.3 樹的核心術語1.4 樹的表示方法(孩子兄弟表示法)結構定義為什么用孩子兄弟表示法?1.5 樹的實際應…

STAR-CCM+|雷諾數回顧

【1】引言 前序已經學習了K-epsilon湍流模型溯源的基礎知識,今天再學習一些更為基礎的知識,回顧一下雷諾數ReReRe。 【2】雷諾數定義 雷諾數公式為: ReρvDμRe\frac{\rho vD}{\mu}ReμρvD? 式中, ρ\rhoρ——流體密度&…

Java中的死鎖

鎖的合理使用能夠保證共享數據的安全性,但是 使用不當也會可能引起死鎖。1. 死鎖概念 死鎖是指兩個或兩個以上的線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力干涉那它們都將無法推進下去,如果系統資源充足,進程的資源請求…

基于STM32F103C8T6的智能家居健康環境監測系統

項目開發背景 隨著城市化進程加速和居民生活水平提升,人們對家居環境健康與安全的需求日益增強。現代住宅常因裝修材料、密閉空間及外部污染導致甲醛超標、PM2.5濃度升高、溫濕度失衡等問題,長期暴露此類環境中易引發呼吸道疾病、過敏反應等健康隱患。傳…

2025職場進階:B端產品經理必備的計算機專業技能精要

當前企業級服務市場競爭日益激烈,2025年的B端產品經理不僅需要深厚的行業認知,還必須具備扎實的計算機專業技能,才能設計出真正符合技術趨勢與業務需求的企業級產品。而其中,人工智能技術已經成為B端產品不可或缺的組成部分&#…