處理線程安全的列表CopyOnWriteArrayList 和Collections.synchronizedList

ConcurrentModificationException?是 Java 中的一種異常,用于指示在迭代集合時,該集合的結構發生了并發修改。

在 Java 中,許多集合類(如?ArrayList,?HashMap?等)都不是線程安全的。如果一個線程在迭代集合的同時,另一個線程修改了該集合的結構(如添加、刪除元素),就可能導致?ConcurrentModificationException?異常的拋出。

這種異常通常在使用迭代器遍歷集合時發生,迭代器在創建時會記錄集合的結構狀態,如果在迭代期間發現集合結構已經發生了變化,就會拋出?ConcurrentModificationException

CopyOnWriteArrayList?和?Collections.synchronizedList都是 Java 中用于處理線程安全的列表操作的工具類,但它們在實現和適用場景上有一些區別。

CopyOnWriteArrayList

作用:

  • CopyOnWriteArrayList?是一種適合讀操作遠多于寫操作的線程安全列表實現。
  • 寫操作(如添加、修改、刪除元素)會創建一個當前列表的副本,對副本進行操作,寫操作完成后將副本替換原來的列表。這保證了寫操作不會影響到正在進行的讀操作,從而避免了并發修改異常 (ConcurrentModificationException)。

優點:

  • 適合讀多寫少的場景,因為讀操作不需要加鎖,性能較高。
  • 寫操作通過復制數組來實現線程安全,避免了使用顯式鎖帶來的性能損失。

缺點:

  • 寫操作的性能相對較低,因為每次寫操作都要復制整個數組。
  • 內存消耗較大,因為每次寫操作都會復制數組。

示例用法:

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.List;List<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
list.add(3);
// 在多線程環境中安全地進行讀寫操作
for (Integer num : list) {System.out.println(num);}// 注意:不建議在迭代過程中進行寫操作,因為迭代器不支持修改操作

Collections.synchronizedList

作用:

  • Collections.synchronizedList?是通過包裝普通的?ArrayList(或其他?List?實現)來生成線程安全的列表。
  • 它使用了一個對象級的鎖(即在列表對象上加鎖),來確保多個線程不能同時修改列表,從而保證線程安全。

優點:

  • 相對于?CopyOnWriteArrayList,它在寫操作時不需要復制整個數組,因此寫操作的性能可能會更好一些。
  • 使用簡單,通過靜態方法?Collections.synchronizedList?就可以獲取線程安全的列表。

缺點:

  • 在高并發環境下,由于使用了對象級的鎖,可能會造成性能瓶頸。
  • 需要手動管理使用到的鎖,編寫代碼時需要確保在所有訪問列表的地方都正確地加鎖。

示例用法:

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;List<Integer> list = Collections.synchronizedList(new ArrayList<>());
list.add(1);
list.add(2);
list.add(3);
// 手動在多線程環境中通過 synchronized 同步塊或方法來安全地訪問 listsynchronized (list) {for (Integer num : list) {System.out.println(num);}}

區別比較

  1. 性能特征

    • CopyOnWriteArrayList?適合讀多寫少的場景,讀操作高效,寫操作較慢(讀操作訪問同一份列表,不加鎖)。
    • Collections.synchronizedList?在寫操作的性能上可能會優于?CopyOnWriteArrayList,但在高并發情況下可能引入較大的性能開銷(讀寫操作都加上鎖)。
  2. 內部實現

    • CopyOnWriteArrayList?寫操作通過復制數組來實現線程安全。
    • Collections.synchronizedList?使用 synchronized 關鍵字或者內部鎖來保證線程安全。
  3. 使用方式

    • CopyOnWriteArrayList?直接使用構造函數或者?add?等方法來操作列表,不需要額外的同步控制。
    • Collections.synchronizedList?需要在使用時通過 synchronized 關鍵字或者同步塊來手動管理線程安全。

選擇合適的列表實現

  • 讀多寫少:推薦使用?CopyOnWriteArrayList,因為它可以提供較高的讀取性能。
  • 讀寫操作均衡或者寫多讀少:考慮使用?Collections.synchronizedList?或其他更復雜的并發控制方式,根據具體情況選擇合適的同步策略。

總結來說,根據應用場景和性能要求選擇合適的線程安全列表實現,能夠有效地避免并發訪問帶來的問題。

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

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

相關文章

IDEA的JAVA版本沒有8怎么辦

問題&#xff1a; 很多小伙伴會出現如下的情況&#xff0c;java的版本很高&#xff0c;沒有8 解決 更換IDEA內置的Server URL的鏡像地址 就是這個 把其中的地址換成 https://start.aliyun.com/ https://start.aliyun.com/ 我們可以看到JAVA 8就出現了

Vue Router 4:構建高效單頁面應用的路由管理

引言 Vue Router的重要性在于它極大地簡化了單頁面應用(SPA)的開發流程。通過Vue Router&#xff0c;開發者可以輕松地將URL映射到對應的組件&#xff0c;實現頁面的無刷新跳轉&#xff0c;從而提升用戶體驗。 安裝和設置Vue Router 4 如何在Vue 3項目中安裝Vue Router 4 1…

期貨量化交易客戶端開源教學第四節——交易接口協議

指令介紹: 01----09:服務端發送到客戶端指令 10----49:客戶端發送操作指令 50----59:客戶端與服務端通訊指令 60----99:股票接口與服務端交互指令 --------------------------------------------------- 02:商品行情 03:用戶信息接收 04:用戶資產信息接收 ----發送到…

SpringBoot的動態代理默認用的哪個???

在 Spring Boot 中&#xff0c;動態代理的默認實現方式取決于被代理的對象的類型和具體配置&#xff1a; JDK 動態代理&#xff1a; 當代理的對象實現了一個或多個接口時&#xff0c;Spring 默認使用 JDK 動態代理。JDK 動態代理只能代理實現了接口的類。 CGLIB 動態代理&…

Python-PLAXIS自動化建模技術與典型巖土工程案例

有限單元法在巖土工程問題中應用非常廣泛&#xff0c;很多軟件都采用有限單元解法。在使用各大軟件進行數值模擬建模的過程中&#xff0c;巖土工程中的各種問題&#xff08;塑性、滲流、固結、動力、穩定安全、熱力TM&#xff09;&#xff0c;一步一步地搭建自己的Plaxis模型&a…

dm-verity hashtree的結構

參考了&#xff1a;實現 dm-verity | Android Open Source Project (google.cn)。基于這個添加了一層原始數據&#xff0c;便于理解。 結構圖如下&#xff1a; 對hashtree結構圖的解釋&#xff1a; dev data&#xff1a;表示我們的分區數據。這里我們將dev data按照指定的大…

【C++進階學習】第六彈——set和map——體會用C++來構建二叉搜索樹

set和map基礎&#xff1a;【C進階學習】第五彈——二叉搜索樹——二叉樹進階及set和map的鋪墊-CSDN博客 前言&#xff1a; 在上篇的學習中&#xff0c;我們已經學習了如何使用C語言來實現二叉搜索樹&#xff0c;在C中&#xff0c;我們是有現成的封裝好的類模板來實現二叉搜索樹…

第二講 數據結構

#數組模擬鏈表 #include <iostream> using namespace std; const int N 100010; int head ,e[N], ne[N],idx; //ne[i]表示節點i的next指針是多少 //e[i]表示節點i 的值 //head 表示頭結點的下標 //idx 存儲當前已經用了哪個點 void init() {head -1;//頭結點指向下標為…

前端實現PDF文件打印和下載

在Web開發中&#xff0c;經常需要處理PDF文件&#xff0c;尤其是在業務涉及發票、報告或文檔生成的場景下。本文將詳細介紹如何使用前端技術實現PDF文件的打印和下載&#xff0c;我們將利用HTML5的<embed>元素和JavaScript庫FileSaver.js來完成這一任務。 一、環境準備 …

Python 爬蟲:使用打碼平臺來識別各種驗證碼:

本課程使用的是 超級鷹 打碼平臺&#xff0c; 沒有賬戶的請自行注冊&#xff01; 超級鷹驗證碼識別-專業的驗證碼云端識別服務,讓驗證碼識別更快速、更準確、更強大 使用打碼平臺來攻破驗證碼難題&#xff0c; 是很簡單容易的&#xff0c; 但是要錢&#xff01; 案例代碼及測…

React18+Redux+antd 項目實戰 JS

React18Reduxantd 項目實戰 js Ant Design插件官網 Axios官網 (可配置請求攔截器和響應攔截器) JavaScript官網 Echarts官網 一、項目前期準備 1.創建新項目 hotel-manager npx create-react-app hotel-manager2.安裝依賴 //安裝路由 npm i react-router-domnpm i aixos /…

CentOS搭建郵件服務器:DNS配置方法技巧?

CentOS搭建郵件服務器的流程&#xff1f;如何高效使用CentOS&#xff1f; 在當今數字化時代&#xff0c;郵件服務器的需求日益增加。為了確保郵件能夠順利送達&#xff0c;正確的DNS配置是必不可少的一環。AokSend將詳細介紹在CentOS搭建郵件服務器過程中&#xff0c;如何進行…

SpringBoot新手快速入門系列教程7:基于Redis的一個簡單存取數據的例子

我的教程都是親自測試可行才發布的&#xff0c;如果有任何問題歡迎留言或者來群里我每天都會解答。 新手可能有這樣的疑問&#xff0c;有了數據庫的存取方式&#xff0c;我們為什么還要使用Redis這種緩存數據庫讀取方式呢&#xff1f; 原因主要有以下幾點&#xff1a; 1. 性能…

力扣題解(單詞拆分)

139. 單詞拆分單詞拆分 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 思路&#xff1a; 規定dp[i]…

亞馬遜中小型店鋪如何開店?

對于想要在亞馬遜平臺上開設店鋪的中小型賣家來說&#xff0c;這是一個非常值得關注的話題。作為亞馬遜上的一個重要參與者&#xff0c;中小型店鋪有著廣闊的發展空間和無限的可能性&#xff0c;但也由于成本預算與規模限制&#xff0c;無法與大型店鋪的策略相提并論&#xff0…

字符串模板被噶了,JDK 23 刪除了預覽功能“字符串模板”

之前出了一個視頻&#xff0c;介紹 JDK 23 中的新特性。之后我才發現&#xff0c;在 JDK 21 和 22 中的預覽功能“字符串模板&#xff08;String Templates&#xff09;”&#xff0c;在 JDK 23 中已經沒有了。字符串模板的相關代碼&#xff0c;已經被全部刪除了。 字符串模板的…

Spring Boot 3.3 【二】Spring Boot自動配置機制深度解析

簡單動作&#xff0c;深刻聯結。在這技術海洋&#xff0c;我備好舟&#xff0c;等你揚帆。啟航吧&#xff01; &#x1f31f;點擊【關注】&#xff0c;解鎖定期的技術驚喜&#xff0c;讓靈感與知識的源泉不斷涌動。 &#x1f44d;一個【點贊】&#xff0c;如同心照不宣的默契&a…

Unity免費領場景多人實時協作地編2人版局域網和LAN聯機類似谷歌文檔協同合作搭建場景同步資產設置編輯付費版支持10人甚至更多20240709

大家有沒有用過谷歌文檔、石墨文檔、飛書文檔等等之類的協同工具呢&#xff1f; Blender也有類似多人聯機建模的插件&#xff0c; Unity也有類似的多人合作搭建場景的插件啦。 剛找到一款免費插件&#xff0c;可以支持2人局域網和LAN聯機地編。 付費的版本支持組建更大的團隊。…

詳解如何通過稀疏向量優化信息檢索

在信息檢索方法的發展歷程中&#xff0c;我們見證了從傳統的統計關鍵詞匹配到如 BERT 這樣的深度學習模型的轉變。雖然傳統方法提供了堅實的基礎&#xff0c;但往往難以精準捕捉文本的語義關系。如 BERT 這樣的稠密檢索方法通過利用高維向量捕獲文本的上下文語義&#xff0c;為…

煙霧識別技術在火災預防中的應用:思通數科大模型的力量

引言 火災是導致生命財產損失的重大災害之一。早期檢測和快速響應是預防火災和減少損失的關鍵。結合思通數科大模型的煙霧識別技術&#xff0c;為實時檢測和精確定位煙霧來源提供了一種高效的解決方案。本文將探討這一技術如何有效預防火災并保障人員安全。 煙霧識別技術概述 …