優質作者名單
j**a 併發基礎知識:CopyOnWriteArrayList 完全解析 - Programmer Goodcopyonwritearraylist
該類最大的優點是讀取時不需要鎖定,非常適合讀寫較多的併發場景,因為它的寫入操作是通過複製底層資料來實現的,從而保證了讀取資料的一致性和效率,此外,它簡單易用, 是快速實現執行緒安全列表的不錯選擇,CopyOnWriteArrayList 在以讀取操作為主的場景下可以提供出色的效能和穩定性。
copyonwritearraylist
類實現list
randomaccess
跟cloneable
interface 是乙個執行緒安全變體,在修改諸如add
set
等等),它複製底層陣列,然後修改複製的陣列,修改完成後再將內部引用指向新的陣列,這使得讀取操作可以在沒有任何鎖定的情況下進行,因此非常適合讀取次數多、寫入次數少的併發場景。
假設有乙個新聞發布系統,它維護著乙個需要經常閱讀的新聞列表(使用者瀏覽新聞),但只是偶爾修改(發布新新聞或更新現有新聞),在本例中,使用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()
:建立乙個空的copyonwritearraylist
copyonwritearraylist(collection c)
:建立乙個包含指定集合中所有元素的元素copyonwritearraylist
2.閱讀方法(通常不會阻止,因為您在閱讀時不需要鎖定)。
get(int index)
:獲取指定索引位置的元素。 iterator()
:返回乙個迭代器,用於迴圈訪問列表中的元素。 listiterator()
:返回乙個列表迭代器,該迭代器允許在任何方向上遍歷列表,並修改元素(儘管在copyonwritearraylist
修改乙個元素實際上會被丟擲unsupportedoperationexception
toarray()
:返回包含列表中所有元素的陣列。 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
,則會丟擲修改操作unsupportedoperationexception
equals(object o)
:比較此列表是否等於指定的物件。 hashcode()
:返回列表的雜湊碼值。 copyonwritearraylist
寫入操作(修改方法)是通過複製底層陣列來實現的,因此在高併發寫入場景中效能可能會受到嚴重影響,在這種情況下,其他併發資料結構(如concurrenthashmap
segment
陣列concurrentlinkedqueue
或concurrentskiplistmap
等等,可能是更好的選擇。 但是,建議在讀取次數較多且寫入次數較少的情況下使用copyonwritearraylist
,它提供了高效且執行緒安全的解決方案。
j**a 併發基礎知識:CopyOnWriteArrayList 完全解析 - Programmer Goodcopyonwritearraylist
Class 是乙個執行緒安全列表實現,非常適合讀取次數多、寫入次數少的併發場景,優點是讀取操作不需要鎖定,效能高效,可以保證資料的一致性。 在寫入操作過程中,會複製底層陣列,避免阻塞讀取操作,從而實現讀寫分離。 但是,寫入成本很高,因為每次修改都需要複製整個陣列,這在資料量大或寫入頻繁時會產生顯著的效能開銷,並且不適合需要頻繁修改列表的場景,因為每次修改都會生成乙個新的陣列副本, 導致更高的記憶體占用。
在讀取操作遠多於寫入操作,且實時資料要求不高的場景下copyonwritearraylist
這是乙個不錯的選擇,但如果寫入頻繁或資料量大,建議考慮其他更適合的併發資料結構,例如:concurrentlinkedqueue
或concurrenthashmap
等。
跟著我,每天學習網際網絡程式設計技術——程式設計師古德結束!end!end!
j**a 併發基礎知識:ConcurrentSkiplistMap 已完全解析。
j**a 併發基礎:ConcurrentSkipListSet 完整分析!
j**a 併發基礎知識:SynchronousQueue 完整分析!
j**a 併發基礎知識:ConcurrentLinkedQueue 全解像度!
J**A 併發基礎知識:交換器全解像度!