Java 併發基礎知識 CopyOnWriteArrayList 已完全解析

Mondo 科技 更新 2024-02-19

優質作者名單

j**a 併發基礎知識:CopyOnWriteArrayList 完全解析 - Programmer Goodcopyonwritearraylist該類最大的優點是讀取時不需要鎖定,非常適合讀寫較多的併發場景,因為它的寫入操作是通過複製底層資料來實現的,從而保證了讀取資料的一致性和效率,此外,它簡單易用, 是快速實現執行緒安全列表的不錯選擇,CopyOnWriteArrayList 在以讀取操作為主的場景下可以提供出色的效能和穩定性。

copyonwritearraylist類實現listrandomaccesscloneableinterface 是乙個執行緒安全變體,在修改諸如addset等等),它複製底層陣列,然後修改複製的陣列,修改完成後再將內部引用指向新的陣列,這使得讀取操作可以在沒有任何鎖定的情況下進行,因此非常適合讀取次數多、寫入次數少的併發場景。

假設有乙個新聞發布系統,它維護著乙個需要經常閱讀的新聞列表(使用者瀏覽新聞),但只是偶爾修改(發布新新聞或更新現有新聞),在本例中,使用copyonwritearraylist儲存新聞列表可能是乙個不錯的選擇。

讀取操作:當使用者瀏覽新聞時,系統需要從新聞列表中讀取資料,因為copyonwritearraylist讀取操作是無鎖的,因此多個使用者可以同時閱讀新聞列表而不會相互阻塞,這有助於提高系統的吞吐量。 寫入操作:當新聞編輯發布新新聞或更新現有新聞時,系統需要修改新聞列表copyonwritearraylist寫入會複製整個底層陣列,但由於它們不常見,因此不會成為效能瓶頸,並且由於寫入是在新陣列上進行的,因此讀取不會被阻止,這有助於保持系統響應。 copyonwritearraylist類特別適合讀取和寫入次數較低的方案,它們通常用於解決如下方案中的問題:

執行緒安全:在多執行緒環境中,正常arraylist如果有多個執行緒同時修改,則不是執行緒安全的arraylist,這可能導致資料不一致copyonwritearraylist執行緒安全是通過內部複製機制來保證的,即當乙個執行緒修改列表(如新增或刪除元素)時,會先複製當前列表的副本,然後對副本進行修改,修改完成後再將內部引用指向新副本,這樣讀取操作就可以繼續在原始列表上進行,而不會被修改所阻塞操作。讀/寫分離:由於copyonwritearraylist寫入操作(修改操作)在新陣列上執行,而讀取操作在原始未修改的陣列上執行,因此讀取和寫入操作不會相互干擾copyonwritearraylist它在高併發讀取的場景中表現良好。 資料一致性:通過複製整個底層陣列來確保修改操作的原子性copyonwritearraylist提供了強一致性保證,因此讀取者要麼看到修改前的列表狀態,要麼看到修改後的列表狀態,而不是中間狀態。 copyonwritearraylist它並不適合所有場景,因為寫入操作需要複製整個底層陣列,因此當列表較大或寫入操作非常頻繁時,會導致記憶體開銷大,效能下降。

下面是乙個簡單的 j**a 程式,演示了如何使用它copyonwritearraylist類,乙個是在案例中建立的copyonwritearraylist例項,並模擬多個執行緒同時讀寫,如下所示:

import j**a.util.list; 

import j**a.util.concurrent.copyonwritearraylist;

public class copyonwritearraylistdemo catch (interruptedexception e)

system.out.println("writer thread finished!");

.start();

啟動多個執行緒以從列表中讀取元素

for (int i = 0; i < 3; i++)catch (interruptedexception e)

.start();

在上面,建立了乙個copyonwritearraylist例項list,啟動乙個執行緒來模擬乙個寫入操作來向列表中新增乙個元素,這個執行緒使用迴圈將 5 個元素新增到列表中,每次新增後暫停 100 毫秒以模擬耗時的操作,然後,啟動 3 個執行緒來模擬讀取操作以從列表中讀取乙個元素, 每個執行緒使用迴圈讀取列表 10 次,並在每次讀取後暫停 50 毫秒以模擬耗時的操作,因為copyonwritearraylist底層陣列在新陣列上複製和修改,因此讀取不受寫入的影響,從而確保執行緒安全和資料一致性。

copyonwritearraylist類提供執行緒安全arraylist實現,它通過在修改時複製基礎陣列來實現執行緒安全,因此它特別適合讀取較多而寫入較少的併發方案,以下是 CopyOnWriteArrayList 類中一些主要方法的含義:

一、施工方法

copyonwritearraylist():建立乙個空的copyonwritearraylistcopyonwritearraylist(collection c):建立乙個包含指定集合中所有元素的元素copyonwritearraylist2.閱讀方法(通常不會阻止,因為您在閱讀時不需要鎖定)。

get(int index):獲取指定索引位置的元素。 iterator():返回乙個迭代器,用於迴圈訪問列表中的元素。 listiterator():返回乙個列表迭代器,該迭代器允許在任何方向上遍歷列表,並修改元素(儘管在copyonwritearraylist修改乙個元素實際上會被丟擲unsupportedoperationexceptiontoarray():返回包含列表中所有元素的陣列。 3.修改方法(修改時複製基礎陣列可能需要更多時間)。

add(e e):在列表末尾新增元素。 add(int index, e element):在列表中的指定位置插入元素。 addall(collection c):將指定集合中的所有元素新增到列表的末尾。 addall(int index, collection c):將指定集合中的所有元素插入到列表中的指定位置。 set(int index, e element):替換列表中指定的元素。 remove(int index):從列表中的指定位置刪除元素。 remove(object o):刪除列表中的第乙個指定元素(如果存在)。 removeall(collection c):從列表中刪除指定集合中包含的所有元素。 retainall(collection c):僅保留列表中指定集合中包含的元素。 clear():清除列表中的所有元素。 4. 查詢方式

contains(object o):檢查列表中是否包含指定的元素。 containsall(collection c):檢查列表是否包含指定集中的所有元素。 isempty():檢查列表是否為空。 size():返回列表中的元素數。 indexof(object o):返回列表中指定元素首次出現的索引,如果列表不包含此元素,則返回 -1。 lastindexof(object o):返回列表中指定元素最後一次出現的索引,如果列表不包含此元素,則返回 -1。 5.其他方法

sublist(int fromindex, int toindex):返回列表中指定的部分檢視(注意返回的不是新的獨立列表,對返回列表的修改會影響原始列表,而是由於。copyonwritearraylist,則會丟擲修改操作unsupportedoperationexceptionequals(object o):比較此列表是否等於指定的物件。 hashcode():返回列表的雜湊碼值。 copyonwritearraylist寫入操作(修改方法)是通過複製底層陣列來實現的,因此在高併發寫入場景中效能可能會受到嚴重影響,在這種情況下,其他併發資料結構(如concurrenthashmapsegment陣列concurrentlinkedqueueconcurrentskiplistmap等等,可能是更好的選擇。 但是,建議在讀取次數較多且寫入次數較少的情況下使用copyonwritearraylist,它提供了高效且執行緒安全的解決方案。

j**a 併發基礎知識:CopyOnWriteArrayList 完全解析 - Programmer GoodcopyonwritearraylistClass 是乙個執行緒安全列表實現,非常適合讀取次數多、寫入次數少的併發場景,優點是讀取操作不需要鎖定,效能高效,可以保證資料的一致性。 在寫入操作過程中,會複製底層陣列,避免阻塞讀取操作,從而實現讀寫分離。 但是,寫入成本很高,因為每次修改都需要複製整個陣列,這在資料量大或寫入頻繁時會產生顯著的效能開銷,並且不適合需要頻繁修改列表的場景,因為每次修改都會生成乙個新的陣列副本, 導致更高的記憶體占用。

在讀取操作遠多於寫入操作,且實時資料要求不高的場景下copyonwritearraylist這是乙個不錯的選擇,但如果寫入頻繁或資料量大,建議考慮其他更適合的併發資料結構,例如:concurrentlinkedqueueconcurrenthashmap等。

跟著我,每天學習網際網絡程式設計技術——程式設計師古德結束!end!end!

j**a 併發基礎知識:ConcurrentSkiplistMap 已完全解析。

j**a 併發基礎:ConcurrentSkipListSet 完整分析!

j**a 併發基礎知識:SynchronousQueue 完整分析!

j**a 併發基礎知識:ConcurrentLinkedQueue 全解像度!

J**A 併發基礎知識:交換器全解像度!

相關問題答案

    Java 併發基礎知識 CyclicBarrier 分析!

    優質作者名單 J A 併發基礎 CyclicBarrier 的綜合分析!CyclicBarrier 的優勢在於實現了執行緒之間的相互等待和協作,保證了所有執行緒只有在到達預定的障礙點後才能繼續執行,它支援障礙的復用,非常適合多輪次任務同步,此外,CyclicBarrier 還允許在障礙點執行特定的操...

    Java 併發基礎知識 CountDownLatch 全面分析!

    優質作者名單 j a 併發基礎知識 CountDownLatch 完整分析!程式設計師古德countdownlatch優點是可以簡潔高效地協調多個執行緒的執行順序,保證只有一組執行緒完成後才會觸發其他執行緒的執行,適用於資源載入 任務初始化等場景。它提供了清晰的等待通知機制,易於理解和使用,是提高多...

    Java 併發基礎知識 LinkedBlockingQueue 完整分析!

    優質作者名單 J A 併發基礎知識 LinkedBlockingDeque 完整分析!程式設計師古德linkedblockingqueue類是具有鍊表結構的高效執行緒安全佇列,具有出色的併發效能 靈活的阻塞和非阻塞操作,以及與生產者和消費者模式一起工作的能力linkedblockingqueue它還...

    Java 併發基礎知識 LinkedBlockingDeque 全面分析!

    優質作者名單 J A 併發基礎知識 LinkedBlockingDeque 完整分析!程式設計師古德linkedblockingdeque它提供了雙端佇列的執行緒安全實現,支援佇列兩端的高效插入和刪除操作,並具有可以很好地協調生產者和消費者之間速度差異的阻塞功能,其內部鍊表結構使得出色的併發效能,非...

    Java 併發基礎知識 PriorityBlockingQueue 已完全解決!

    優質作者名單 J A 併發基礎知識 PriorityBlockingQueue 已完全解析!程式設計師古德priorityblockingqueue同時,作為blockingqueue介面的實現,它提供了執行緒安全佇列操作,適用於多執行緒環境下的任務排程和資源管理,簡潔而強大的API使開發者可以輕鬆...