多線程開發中List的使用

由于ArrayList在多線程高并發情況下是不安全的,因此要慎用,那么此時如果涉及到集合操作,應該怎么選:

方案一:Vector:

特點:通過給所有方法都用?synchronized?修飾從而保證線程安全,

缺點:CopyOnWriteArrayList

  • 高并發場景下性能較差(鎖競爭嚴重)。

  • 即使單線程環境也會因同步開銷影響性能。

總結:不建議使用。

方案二:Collections.synchronizedList

特點:低并發讀寫,簡單封裝?ArrayList,所有方法加鎖。

缺點:高并必情況下性能不如CopyOnWriteArrayList

使用示例:

List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// 復合操作仍需外部同步
synchronized (syncList) {if (!syncList.contains("value")) {syncList.add("value");}
}

方案三:CopyOnWriteArrayList

特點:

? ? 1.讀操作:無鎖,直接訪問底層數組;

? ? ? ? ? ? 2.寫操作:復制新數組,修改后替換舊數組(適合?讀多寫極少?的場景)。

缺點:

? ? ? ? ? ?1.寫操作開銷大(需復制數組)。

? ? ? ? ? ?2.數據一致性弱:讀取的是某一時刻的快照,可能讀到舊數據。

使用示例:

// 示例:事件監聽器列表
private final List<Listener> listeners = new CopyOnWriteArrayList<>();

?拓展:

CopyOnwriteArrayList通過JUC包下的lock來實現線程間的同步的, 可實現了讀讀操作和讀寫操作不互斥。
它是怎么實現讀寫不互斥的呢?
在面臨寫操作的時候,CopyOnwriteArrayList會先復制原來的數組并且在新數組上進行修改,最后再將原數組覆蓋。如果寫操作過程中發生了線程切換。并且切換到讀線程,因為此時數組并未發生覆蓋,讀操作讀取的還是原數組。另外,數組定義private transient volatile Object[] array,其中采用volatile修飾,保證內存可見性,讀取線程可以馬上知道這個修改。也就是說當讀寫并發時讀操作是在舊數組中讀到的舊值(一致性弱)。

方案四:ConcurrentLinkedQueue

特點:

? 1.高并發隊列操作(如任務分發),基于 CAS 無鎖實現。

? ? ? 2.線程安全:多線程并發添加無需額外同步。

? ? ? 3. 無阻塞:操作立即返回,不會因鎖競爭導致線程掛起。

? ? ? 4. 無容量限制:隊列會動態擴展。

缺點

? ? ? ? 1.不支持隨機訪問(非?List?接口實現)。

? ? ? ? 2.弱一致性:迭代器創建后,其他線程的修改可能不會立即反映到遍歷中。

? ? ? ??3.不支持?remove()?操作:嘗試通過迭代器刪除元素會拋出?UnsupportedOperationException

使用示例:

public class Main {public static void main(String[] args) {ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();// 添加元素(推薦使用 offer)queue.offer("A"); // 返回 true 表示成功queue.add("B");   // 與 offer 等效// 讀取并移除頭部元素String head1 = queue.poll(); // 返回 "A",隊列變為 [B]System.out.println("Polled: " + head1);// 僅讀取頭部元素(不移除)String head2 = queue.peek(); // 返回 "B",隊列仍為 [B]System.out.println("Peeked: " + head2);// 隊列為空時queue.poll();               // 移除 "B",隊列為空 []String head3 = queue.poll(); // 返回 nullSystem.out.println("Polled empty: " + head3);}
}

方案五:ConcurrentHashMap?

特點:可實現高性能隨機訪問,需要設置KEY.

方案對比:

開發推薦

現代開發中更推薦?CopyOnWriteArrayList

  • 無鎖讀取:適合多核 CPU 環境,避免線程阻塞。

  • 代碼簡潔:無需手動同步,減少錯誤。

  • 安全迭代:迭代器不會拋出?ConcurrentModificationException

但需注意其?內存占用(寫時復制會占用雙倍空間)。

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

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

相關文章

論文閱讀筆記:Denoising Diffusion Implicit Models (2)

0、快速訪問 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08…

人工智能在醫療領域的前沿應用與挑戰

在當今數字化時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的速度改變著我們的生活&#xff0c;其中醫療領域無疑是受益最為顯著的行業之一。從疾病診斷、治療方案制定到患者護理&#xff0c;AI的應用不僅提高了醫療服務的效率和質量&#xff0c;還為醫…

【計算機網絡】HTTP與HTTPS

文章目錄 1. HTTP定義2. HTTP交互3. HTTP報文格式3.1 抓包工具-fiddler3.2 抓包操作3.3 報文格式3.3.1 請求報文3.3.2 響應報文 4. URL5. 請求頭中的方法6. GET和POST的區別7. HTTP報頭7.1 Host7.2 Content_Length7.3 Content_Type7.4 User-Agent(UA)7.5 Referer7.6 Cookie 8 狀…

怎樣提升大語言模型(LLM)回答準確率

怎樣提升大語言模型(LLM)回答準確率 目錄 怎樣提升大語言模型(LLM)回答準確率激勵與規范類知識關聯類情感與語境類逆向思維類:為什么不,反面案例群體智慧類明確指令類示例引導類思維引導類約束限制類反饋交互類:對話激勵與規范類 給予獎勵暗示:在提示詞中暗示模型如果回…

【分享】內外網文件擺渡系統:讓數據傳輸更安全更可靠

【分享】Ftrans內外網文件擺渡系統&#xff1a;讓數據傳輸更安全更可靠&#xff01; 隨著大數據時代的到來&#xff0c;數據的重要性日漸得到重視&#xff0c;數據作為數字經濟時代下的基礎性資源和戰略性資源&#xff0c;是決定國家經濟發展水平和競爭力的核心驅動力。以行業…

Python自動化面試通關秘籍

Python自動化測試工程師面試&#xff0c;不僅僅是考察你的代碼能力&#xff0c;更看重你如何在項目中靈活運用工具和框架解決實際問題。如果你正準備面試&#xff0c;這篇文章將為你總結最常見的高頻考題及答題技巧&#xff0c;幫助你快速上手&#xff0c;通關面試&#xff0c;…

Logstash開啟定時任務增量同步mysql數據到es的時區問題

本文使用修改時間modify_date作為增量同步檢測字段&#xff0c;可檢測新增和修改&#xff0c;檢測不到刪除&#xff0c;檢測刪除請使用canal查詢binlog日志同步數據 檢測修改時間字段為varchar的時候可以先創建索引&#xff0c;并設置對應的mapping為&#xff08;可以無視時區…

如何使用 FastAPI 構建 MCP 服務器

哎呀&#xff0c;各位算法界的小伙伴們&#xff01;今天咱們要聊聊一個超酷的話題——MCP 協議&#xff01;你可能已經聽說了&#xff0c;Anthropic 推出了這個新玩意兒&#xff0c;目的是讓 AI 代理和你的應用程序之間的對話變得更順暢、更清晰。不過別擔心&#xff0c;為你的…

【Git】-- 處理 Git 提交到錯誤分支的問題

如果你不小心把本應提交到 test 分支的代碼提交到了 master 分支&#xff08;但尚未 push&#xff09;&#xff0c;可以按照以下步驟解決&#xff1a; 方法一&#xff08;推薦&#xff09;&#xff1a;使用 git reset 和 git stash 首先&#xff0c;確保你在 master 分支&…

通用目標檢測技術選型分析報告--截止2025年4月

前言 本文撰寫了一份關于通用目標檢測&#xff08;General Object Detection&#xff09;的技術選型分析報告&#xff0c;覆蓋2000至2025年技術演進歷程&#xff0c;重點納入YOLO-World、RT-DETR、Grounding DINO等2024-2025年的最新模型。 報告將包括技術定義、行業現狀、技…

鏈路追蹤Skywalking

一、什么是Skywalking 分布式鏈路追蹤的一種方式&#xff1a;Spring Cloud SleuthZipKin&#xff0c;這種方案目前也是有很多企業在用&#xff0c;但是作為程序員要的追逐一些新奇的技術&#xff0c;Skywalking作為后起之秀也是值得大家去學習的。 Skywalking是一個優秀的國產…

websocket獲取客服端真實ip

在websocket建立連接時,獲取訪問客戶端的真實ip 1. websocket建立連接過程 2. pom依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>3. 添加配置,握…

NSSCTF(MISC)—[justCTF 2020]pdf

相應的做題地址&#xff1a;https://www.nssctf.cn/problem/920 binwalk分離 解壓文件2AE59A.zip mutool 得到一張圖片 B5F31內容 B5FFD內容 轉換成圖片 justCTF{BytesAreNotRealWakeUpSheeple}

部分國產服務器CPU及內存性能測試情況

近日對部分國產服務器進行了CPU和內存的性能測試&#xff0c; 服務器包括華錕振宇、新華三和中興三家&#xff0c;CPU包括鯤鵬、海光和Intel&#xff0c;初步測試結果如下&#xff1a; 服務器廠商四川華錕振宇新華三中興中興服務器HuaKun TG225 B1R4930 G5R5930 G2R5300 G4操作…

【無標題】Scala函數基礎

函數和方法的區別 1&#xff09; 核心概念 &#xff08;1&#xff09; 為完成某一功能的程序語句的集合&#xff0c;稱為函數。 &#xff08;2&#xff09; 類中的函數稱之方法。 2&#xff09; 案例實操 &#xff08;1&#xff09; Scala 語言可以在任何的語法結構中聲明…

uniapp -- 列表垂直方向拖拽drag組件

背景 需要在小程序中實現拖拽排序功能,所以就用到了m-drag拖拽組件,在開發的過程中,發現該組件在特殊的場景下會有些問題,并對其進行了拓展。 效果 組件代碼 <template><!-- 創建一個垂直滾動視圖,類名為m-drag --><scroll

conda安裝python 遇到 pip is configured with locations that require TLS/SSL問題本質解決方案

以前寫了一篇文章&#xff0c;不過不是專門為了解決這個問題的&#xff0c;但是不能訪問pip install 不能安裝來自https 協議的包問題幾乎每次都出現&#xff0c;之前解決方案只是治標不治本 https://blog.csdn.net/wangsenling/article/details/130194456???????https…

【初階數據結構】隊列

文章目錄 目錄 一、概念與結構 二、隊列的實現 隊列的定義 1.初始化 2.入隊列 3.判斷隊列是否為空 4.出隊列 5.取隊頭數據 6.取隊尾數據 7.隊列有效個數 8.銷毀隊列 三.完整源碼 總結 一、概念與結構 概念&#xff1a;只允許在一端進行插入數據操作&#xff0c;在另一端進行刪除…

Apache Shiro 全面指南:從入門到高級應用

一、Shiro 概述與核心架構 1.1 什么是 Shiro&#xff1f; Apache Shiro 是一個強大且易用的 Java 安全框架&#xff0c;它提供了認證&#xff08;Authentication&#xff09;、授權&#xff08;Authorization&#xff09;、加密&#xff08;Cryptography&#xff09;和會話管…

es 3期 第28節-深入掌握集群組建與集群設置

#### 1.Elasticsearch是數據庫&#xff0c;不是普通的Java應用程序&#xff0c;傳統數據庫需要的硬件資源同樣需要&#xff0c;提升性能最有效的就是升級硬件。 #### 2.Elasticsearch是文檔型數據庫&#xff0c;不是關系型數據庫&#xff0c;不具備嚴格的ACID事務特性&#xff…