Java高頻面試之集合-08

hello啊,各位觀眾姥爺們!!!本baby今天來報道了!哈哈哈哈哈嗝🐶

面試官:詳細說說CopyOnWriteArrayList


CopyOnWriteArrayList 詳解

CopyOnWriteArrayList 是 Java 并發包(java.util.concurrent)中提供的線程安全列表,基于“寫時復制”(Copy-On-Write)機制實現。它適用于讀多寫少的高并發場景,如事件監聽器列表、配置管理等。


核心特性
特性說明
線程安全讀操作無鎖,寫操作通過鎖保證線程安全。
數據一致性讀操作基于快照,迭代期間不會拋出 ConcurrentModificationException
寫開銷每次修改操作會復制底層數組,內存占用較高。
適用場景讀操作頻繁,寫操作極少(如監聽器管理、配置存儲)。

底層實現
  1. 數據結構

    • 基于動態數組(volatile Object[] array)存儲數據。
    • 所有讀操作直接訪問當前數組,無需同步。
  2. 寫時復制(COW)

    • 修改操作流程
      1. 加鎖(ReentrantLock)。
      2. 復制原數組,生成新數組。
      3. 在新數組上執行修改操作。
      4. 將底層數組引用指向新數組(setArray(newArray))。
      5. 釋放鎖。
    • 代碼示例(add 方法)
      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();}
      }
      
  3. 迭代器

    • 基于迭代器創建時的數組快照遍歷數據。
    • 不支持修改操作(如 removeset),調用會拋出 UnsupportedOperationException
    • 代碼示例
      public Iterator<E> iterator() {return new COWIterator<E>(getArray(), 0);
      }
      

優點與缺點
優點缺點
讀操作無鎖,性能極高。寫操作內存開銷大(復制全量數據)。
避免并發修改異常(ConcurrentModificationException)。數據弱一致性(讀操作可能不反映最新狀態)。
實現簡單,適合讀多寫少場景。寫操作頻繁時性能急劇下降。

適用場景
  1. 監聽器列表
    如 GUI 事件監聽器,注冊后極少修改,但頻繁觸發事件(讀)。

    // 添加監聽器(寫操作少)
    listeners.add(new Listener());// 觸發事件(讀操作多)
    for (Listener listener : listeners) {listener.onEvent();
    }
    
  2. 配置管理
    系統配置通常加載后很少修改,但頻繁讀取。

    CopyOnWriteArrayList<Config> configs = loadConfigs();
    // 讀取配置(無鎖)
    String value = configs.get(0).getProperty("key");
    
  3. 緩存快照
    需要緩存某個時間點的數據快照供查詢。


性能對比
操作ArrayListCopyOnWriteArrayListCollections.synchronizedList
讀(單線程)O(1)(最快)O(1)(無鎖,快)O(1)(同步開銷,較慢)
讀(高并發)非線程安全,需外部同步O(1)(無鎖,最快)O(1)(同步開銷,慢)
寫(單線程)O(1)(快)O(n)(復制數組,慢)O(1)(同步開銷,較慢)
寫(高并發)非線程安全O(n)(鎖競爭,最慢)O(1)(同步開銷,慢)

注意事項
  1. 避免頻繁寫操作
    批量寫入時,優先使用 addAll 代替多次 add,減少數組復制次數。

    // 不推薦
    for (String item : items) {list.add(item);
    }// 推薦
    list.addAll(items);
    
  2. 迭代器弱一致性
    迭代器遍歷的是創建時的快照,可能無法感知后續修改。

    CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
    Iterator<Integer> it = list.iterator();
    list.add(4);
    while (it.hasNext()) {System.out.print(it.next()); // 輸出 1,2,3(不包含4)
    }
    
  3. 內存監控
    大對象或超大數組可能導致內存壓力,需監控堆內存使用。


🐮🐎
  • 使用場景:讀多寫少,允許數據弱一致性。
  • 替代方案
    • 寫多讀少:考慮 ConcurrentLinkedQueueConcurrentHashMap
    • 強一致性需求:使用鎖或 synchronizedList
  • 最佳實踐:結合業務特點選擇數據結構,必要時進行性能壓測。

在這里插入圖片描述

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

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

相關文章

【微信小程序 onTabItemTap:精準監聽 TabBar 點擊事件】

onTabItemTap 是微信小程序中的一個頁面生命周期函數&#xff0c;用于監聽用戶點擊 TabBar 上的某個項時的事件。以下是如何運用 onTabItemTap 的詳細說明&#xff1a; 使用場景 onTabItemTap 適用于需要在用戶點擊 TabBar 切換頁面時執行特定邏輯的場景。例如&#xff0c;你…

痙攣性斜頸需要做手術嗎?

痙攣性斜頸的治療是一個涉及多種醫學知識的話題&#xff0c;讓我們從多方面分析這個問題&#xff0c;來談談是否需要進行手術。 首先&#xff0c;我們要明確痙攣性斜頸是一種什么疾病。痙攣性斜頸是一種頸部肌肉異常收縮的疾病&#xff0c;可能導致頭部持續或間歇性地向一側旋…

AOT是什么?

https://www.bilibili.com/video/BV1Es4y1q7Bf?spm_id_from333.788.player.switch&vd_source12d5954938d20d50645e227a6a728c76&p87常規的java代碼是即時解釋執行的&#xff0c;只有熱點代碼才會提前編譯成二進制&#xff0c;并且將java代碼放到別的電腦執行時得安裝j…

【JavaWeb學習Day23】

Maven高級 分模塊設計與開發 分模塊設計&#xff1a;將一個大項目分成若干個子模塊&#xff0c;方便項目的維護、擴展&#xff0c;也方便模塊間的相互引用&#xff0c;資源共享。 策略&#xff1a; 1.策略一&#xff1a;按照功能模塊拆分&#xff0c;比如&#xff1a;公共組…

圖像的特征

圖像的特征主要包括以下幾類&#xff1a; 1. 顏色特征&#xff1a; 直方圖&#xff1a;描述圖像中顏色的分布。 顏色矩&#xff1a;通過顏色的均值、方差等統計量表示顏色分布。 主色調&#xff1a;圖像中占主導地位的顏色。 2. 紋理特征&#xff1a; 灰度共生矩陣&#xff0…

?LeetCode周賽 3468. 可行數組的數目——暴力與數學?

?LeetCode周賽 3468. 可行數組的數目——暴力與數學? 示例 1&#xff1a; 輸入&#xff1a;original [1,2,3,4], bounds [[1,2],[2,3],[3,4],[4,5]] 輸出&#xff1a;2 解釋&#xff1a; 可能的數組為&#xff1a; [1, 2, 3, 4] [2, 3, 4, 5] 示例 2&#xff1a; 輸入&…

AF3 squeeze_features函數解讀

AlphaFold3 data_transforms 模塊的 squeeze_features 函數的作用去除 蛋白質特征張量中不必要的單維度&#xff08;singleton dimensions&#xff09;和重復維度&#xff0c;以使其適配 AlphaFold3 預期的輸入格式。 源代碼&#xff1a; def squeeze_features(protein):&qu…

【打卡d4】日期類--分組輸入

第一題&#xff1a;根據一年中的第 n 天計算日期 &#x1f4cc; 知識點 判斷閏年&#xff1a; 閏年條件&#xff1a;能被 400 整除&#xff0c;或 能被 4 整除但不能被 100 整除。平年&#xff1a;2 月 28 天&#xff1b;閏年&#xff1a;2 月 29 天。 累加月份&#xff0c;找…

JAVA(5)-基礎概念

*固定格式 一.注釋和關鍵字 關鍵字&#xff1a;被賦予特定關系的詞 字母全部小寫&#xff0c;如class表示一個類 二.字面量 1.字面量類型 *字符串里面的類型是一句話&#xff0c;用雙引號 字符里面的類型只有一個字或字母 null只能用字符串的方式打印 2.制表符 \t 至少補…

本地部署Navidrome個人云音樂平臺隨時隨地暢聽本地音樂文件

文章目錄 前言1. 安裝Docker2. 創建并啟動Navidrome容器3. 公網遠程訪問本地Navidrome3.1 內網穿透工具安裝3.2 創建遠程連接公網地址3.3 使用固定公網地址遠程訪問 前言 今天我要給大家安利一個超酷的私有化音樂神器——Navidrome&#xff01;它不僅讓你隨時隨地暢享本地音樂…

C++ 中的RAII(資源獲取及初始化)

C 中的RAII(資源獲取即初始化) RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是C中一種重要的編程范式&#xff0c;全稱為“資源獲取即初始化”。它是一種通過對象生命周期管理資源&#xff08;如內存、文件句柄、網絡連接等&#xff09;的技術&#x…

藍橋杯嵌入式組第七屆省賽題目解析+STM32G431RBT6實現源碼

文章目錄 1.題目解析1.1 分而治之&#xff0c;藕斷絲連1.2 模塊化思維導圖1.3 模塊解析1.3.1 KEY模塊1.3.2 ADC模塊1.3.3 IIC模塊1.3.4 UART模塊1.3.5 LCD模塊1.3.6 LED模塊1.3.7 TIM模塊 2.源碼3.第七屆題目 前言&#xff1a;STM32G431RBT6實現嵌入式組第七屆題目解析源碼&…

DeepSeek技術名詞全解析:一場屬于中國AI的“覺醒時刻”

在2025年的人工智能浪潮中&#xff0c;一個名為DeepSeek的中國團隊&#xff0c;用一系列技術突破改寫了全球AI競爭的敘事。從“頓悟時刻”到“群體策略優化”&#xff0c;從“冷啟動”到“長鏈思考”&#xff0c;這些晦澀的技術術語背后&#xff0c;是一場關乎人類智能邊界的革…

【Go語言圣經1.1】

目標 學習Go 的編譯方式、包的組織方式以及工具鏈的統一調用方式 概念與定義 package Go 語言通過包來組織代碼。包類似于其它語言的庫librarries或模塊modules&#xff0c;每個包通常對應一個目錄&#xff0c;目錄中的所有 .go 文件都屬于同一個包。特殊的 main 包 : 當代碼…

主流大語言模型中Token的生成過程本質是串行的

主流大語言模型中Token的生成過程本質是串行的 flyfish 1. 串行生成 自回歸模型的核心邏輯&#xff1a; 大模型&#xff08;如GPT-2&#xff09;采用自回歸架構&#xff0c;每個Token的生成必須基于已生成的完整歷史序列。例如&#xff0c;生成“今天天氣很好”時&#xff1a…

基于PySide6的CATIA零件自動化著色工具開發實踐

引言 在汽車及航空制造領域&#xff0c;CATIA作為核心的CAD設計軟件&#xff0c;其二次開發能力對提升設計效率具有重要意義。本文介紹一種基于Python的CATIA零件著色工具開發方案&#xff0c;通過PySide6實現GUI交互&#xff0c;結合COM接口操作實現零件著色自動化。該方案成…

Python——計算機網絡

一.ip 1.ip的定義 IP是“Internet Protocol”的縮寫&#xff0c;即“互聯網協議”。它是用于計算機網絡通信的基礎協議之一&#xff0c;屬于TCP/IP協議族中的網絡層協議。IP協議的主要功能是負責將數據包從源主機傳輸到目標主機&#xff0c;并確保數據能夠在復雜的網絡環境中正…

Python實例:PyMuPDF實現PDF翻譯,英文翻譯為中文,并按段落創建中文PDF

基于PyMuPDF與百度翻譯的PDF翻譯處理系統開發:中文亂碼解決方案與自動化排版實踐 一 、功能預覽:將英文翻譯為中文后創建的PDF 二、完整代碼 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

xunruicms失敗次數已達到5次,已被禁止登錄怎么處理?

針對遇到的“xunruicms失敗次數已達到5次&#xff0c;已被禁止登錄”的問題以下是幾種處理方法&#xff1a; 開啟開發者模式&#xff1a; 您可以開啟開發者模式來忽略賬號的禁止登錄限制。具體操作步驟如下&#xff1a; 訪問迅睿CMS的官方文檔&#xff0c;找到如何開啟開發者模…

復現 MODEST 機器人抓取透明物體 單目 ICRA 2025

MODEST 單目透明物體抓取算法&#xff0c;來自ICRA 2025&#xff0c;本文分享它的復現過程。 輸入單個視角的RGB圖像&#xff0c;模型需要同時處理深度和分割任務&#xff0c;輸出透明物體的分割結果和場景深度預測。 論文地址&#xff1a;Monocular Depth Estimation and Se…