java中自帶有并發(fā)屬性的List總結(jié)
java中有很多l(xiāng)ist,但是原生支持并發(fā)的并不多,我們?cè)诙嗑€(xiàn)程的環(huán)境中如果想同時(shí)操作同一個(gè)list的時(shí)候,就涉及到了一個(gè)并發(fā)的過(guò)程,這時(shí)候我們就需要選擇自帶有并發(fā)屬性的list,那么java中的并發(fā)list到底有哪些呢?今天要給大家介紹的是ArrayList、CopyOnWriteArrayList、ConcurrentLinkedDeque這幾個(gè)。
各種list的優(yōu)缺點(diǎn)
當(dāng)涉及到并發(fā)編程時(shí),不同的 List 實(shí)現(xiàn)具有各自的優(yōu)點(diǎn)和缺點(diǎn)。下面是對(duì) ArrayList、CopyOnWriteArrayList、ConcurrentLinkedDeque 的優(yōu)缺點(diǎn)進(jìn)行詳細(xì)比較的描述:
ArrayList:
優(yōu)點(diǎn):
- 簡(jiǎn)單易用:ArrayList 是 Java 中最基本的動(dòng)態(tài)數(shù)組,易于理解和使用。
- 高效的隨機(jī)訪(fǎng)問(wèn):由于內(nèi)部基于數(shù)組實(shí)現(xiàn),因此具有良好的隨機(jī)訪(fǎng)問(wèn)性能。
缺點(diǎn):
- 非線(xiàn)程安全:ArrayList 不是線(xiàn)程安全的,當(dāng)多個(gè)線(xiàn)程同時(shí)修改它時(shí)會(huì)出現(xiàn)競(jìng)態(tài)條件。
- 需要外部同步:為了使 ArrayList 在多線(xiàn)程環(huán)境下安全,需要額外的同步措施,如使用
Collections.synchronizedList。
CopyOnWriteArrayList:
優(yōu)點(diǎn):
- 線(xiàn)程安全:CopyOnWriteArrayList 是線(xiàn)程安全的,多個(gè)線(xiàn)程可以同時(shí)讀取而不會(huì)出現(xiàn)問(wèn)題。
- 適用于讀多寫(xiě)少的情況:由于寫(xiě)操作會(huì)復(fù)制整個(gè)數(shù)組,適用于讀多寫(xiě)少的情況,例如日志記錄。
缺點(diǎn):
- 寫(xiě)操作開(kāi)銷(xiāo)大:每次寫(xiě)操作都會(huì)復(fù)制整個(gè)列表,因此寫(xiě)操作的開(kāi)銷(xiāo)較大,不適合高頻寫(xiě)入操作。
- 數(shù)據(jù)不是實(shí)時(shí)的:由于寫(xiě)操作的復(fù)制過(guò)程,讀操作可能會(huì)看到舊數(shù)據(jù),因此不適用于需要實(shí)時(shí)數(shù)據(jù)的場(chǎng)景。
ConcurrentLinkedDeque:
優(yōu)點(diǎn):
- 高并發(fā):ConcurrentLinkedDeque 針對(duì)高并發(fā)讀寫(xiě)進(jìn)行了優(yōu)化,適用于需要高并發(fā)處理的情況。
- 低延遲:添加和刪除操作的性能很好,不會(huì)導(dǎo)致鎖爭(zhēng)用。
缺點(diǎn):
- 不支持隨機(jī)訪(fǎng)問(wèn):ConcurrentLinkedDeque 不支持隨機(jī)訪(fǎng)問(wèn)元素,因?yàn)樗且粋€(gè)雙端隊(duì)列,只能從隊(duì)頭和隊(duì)尾進(jìn)行操作。
- 不適用于所有場(chǎng)景:不適合需要隨機(jī)訪(fǎng)問(wèn)的場(chǎng)景,例如需要根據(jù)索引查找元素的情況。
總的來(lái)說(shuō),選擇哪種 List 實(shí)現(xiàn)取決于您的具體需求。如果您需要高度并發(fā)且讀寫(xiě)操作相對(duì)平衡,ConcurrentLinkedDeque 可能是更好的選擇。如果您主要進(jìn)行讀操作且能夠容忍寫(xiě)操作的開(kāi)銷(xiāo),CopyOnWriteArrayList 是一個(gè)不錯(cuò)的選擇。如果您只在單線(xiàn)程環(huán)境下操作,ArrayList 可能是更簡(jiǎn)單的選擇,但需要注意同步問(wèn)題。
他們的實(shí)現(xiàn)原理
理解這些并發(fā) List 實(shí)現(xiàn)的原理對(duì)于正確使用它們非常重要。以下是這些 List 的實(shí)現(xiàn)原理:
ArrayList:
- 實(shí)現(xiàn):
ArrayList基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)。它內(nèi)部維護(hù)一個(gè)對(duì)象數(shù)組,可以根據(jù)需要進(jìn)行自動(dòng)擴(kuò)展。 - 原理:
ArrayList支持隨機(jī)訪(fǎng)問(wèn),因?yàn)榭梢酝ㄟ^(guò)索引直接訪(fǎng)問(wèn)元素。添加元素時(shí),它會(huì)檢查容量是否足夠,如果不夠,會(huì)創(chuàng)建一個(gè)更大的數(shù)組并將元素復(fù)制到新數(shù)組中。這可能導(dǎo)致內(nèi)部數(shù)組的重新分配和復(fù)制,因此在多線(xiàn)程環(huán)境下需要額外的同步來(lái)確保線(xiàn)程安全。
CopyOnWriteArrayList:
- 實(shí)現(xiàn):
CopyOnWriteArrayList也是基于數(shù)組實(shí)現(xiàn)的,但與普通的ArrayList不同,它在寫(xiě)操作時(shí)不直接修改現(xiàn)有數(shù)組,而是創(chuàng)建一個(gè)新的副本。 - 原理:讀操作在不需要鎖的情況下并發(fā)執(zhí)行,因?yàn)樗鼈兪冀K訪(fǎng)問(wèn)當(dāng)前的數(shù)組。寫(xiě)操作會(huì)復(fù)制當(dāng)前數(shù)組的內(nèi)容到一個(gè)新數(shù)組上,然后執(zhí)行修改操作。這確保了讀操作不受寫(xiě)操作的影響。雖然寫(xiě)操作需要額外的內(nèi)存和復(fù)制,但讀操作非常高效,適用于讀多寫(xiě)少的場(chǎng)景。
ConcurrentLinkedDeque:
- 實(shí)現(xiàn):
ConcurrentLinkedDeque是一個(gè)雙端隊(duì)列,它使用節(jié)點(diǎn)來(lái)連接元素。每個(gè)節(jié)點(diǎn)都包含一個(gè)元素和指向前一個(gè)和后一個(gè)節(jié)點(diǎn)的引用。 - 原理:在多線(xiàn)程環(huán)境下,
ConcurrentLinkedDeque使用CAS(比較并交換)操作來(lái)實(shí)現(xiàn)并發(fā)。添加元素時(shí),它會(huì)在隊(duì)頭或隊(duì)尾創(chuàng)建新的節(jié)點(diǎn),然后通過(guò)CAS操作將新節(jié)點(diǎn)連接到隊(duì)列中。刪除元素時(shí),會(huì)通過(guò)CAS來(lái)更改節(jié)點(diǎn)的引用,以確保線(xiàn)程安全。由于沒(méi)有全局鎖,ConcurrentLinkedDeque允許高并發(fā)的添加和刪除操作,但不支持隨機(jī)訪(fǎng)問(wèn)。
總之,這些并發(fā) List 的實(shí)現(xiàn)原理都是為了在多線(xiàn)程環(huán)境下提供高并發(fā)性能和線(xiàn)程安全。不同的實(shí)現(xiàn)方式適用于不同的使用場(chǎng)景。
使用舉例
在多線(xiàn)程Java應(yīng)用程序中,處理數(shù)據(jù)的并發(fā)訪(fǎng)問(wèn)是一個(gè)常見(jiàn)的挑戰(zhàn)。這里將介紹四種支持并發(fā)的容器:ArrayList、CopyOnWriteArrayList、ConcurrentLinkedDeque的用法和代碼實(shí)現(xiàn)。
ArrayList
使用示例
以下是一個(gè)使用ArrayList的示例:
List<String> arrayList = Collections.synchronizedList(new ArrayList<>());
// 添加元素
arrayList.add("元素1");
arrayList.add("元素2");
// 迭代元素
for (String element : arrayList) {
System.out.println(element);
}CopyOnWriteArrayList
使用示例
下面是一個(gè)使用CopyOnWriteArrayList的示例:
CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
// 添加元素
copyOnWriteArrayList.add("元素1");
copyOnWriteArrayList.add("元素2");
// 迭代元素
for (String element : copyOnWriteArrayList) {
System.out.println(element);
}ConcurrentLinkedDeque
使用示例
ConcurrentLinkedDeque的使用示例如下:
ConcurrentLinkedDeque<String> concurrentLinkedDeque = new ConcurrentLinkedDeque<>();
// 添加元素
concurrentLinkedDeque.offer("元素1");
concurrentLinkedDeque.offer("元素2");
// 獲取并移除元素
String element = concurrentLinkedDeque.poll();
System.out.println("取出元素:" + element);選擇最適合您的容器
在實(shí)際應(yīng)用中,您應(yīng)該根據(jù)需求選擇最適合的容器。如果需要高并發(fā)的讀取操作,可以考慮使用CopyOnWriteArrayList。如果需要高并發(fā)的添加和移除元素操作,可以使用ConcurrentLinkedDeque。最終,根據(jù)項(xiàng)目要求和性能需求來(lái)選擇適當(dāng)?shù)娜萜鳌?/p>
總結(jié)
Java提供了多種支持并發(fā)的容器,如ArrayList、CopyOnWriteArrayList、ConcurrentLinkedDeque。了解它們的用法和性能特點(diǎn)對(duì)于編寫(xiě)高效的多線(xiàn)程程序至關(guān)重要。選擇正確的容器可以顯著提高應(yīng)用程序的性能和可靠性。
到此這篇關(guān)于java中自帶有并發(fā)屬性的List總結(jié)的文章就介紹到這了,更多相關(guān)java list內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼
這篇文章主要介紹了java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Spring框架中@AliasFor注解詳細(xì)說(shuō)明
這篇文章主要給大家介紹了關(guān)于Spring框架中@AliasFor注解詳細(xì)說(shuō)明的相關(guān)資料,@AliasFor是Spring Framework中的一個(gè)注解,它用于指定注解屬性之間的別名關(guān)系,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
Java多線(xiàn)程之哲學(xué)家就餐問(wèn)題詳解
這篇文章主要介紹了Java多線(xiàn)程之哲學(xué)家就餐問(wèn)題詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
詳解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)
這篇文章主要介紹了詳解JAVAEE——SSH三大框架整合(spring+struts2+hibernate),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
如何在IDEA Maven項(xiàng)目中導(dǎo)入本地jar包的步驟
今天小編就為大家分享一篇關(guān)于IDEA Maven項(xiàng)目中導(dǎo)入本地jar包的步驟,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
SpringBoot項(xiàng)目啟動(dòng)報(bào)錯(cuò)踩坑實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目啟動(dòng)報(bào)錯(cuò)踩坑的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02
解決Mybatis-plus自定義TypeHandler查詢(xún)映射結(jié)果一直為null問(wèn)題
這篇文章主要介紹了解決Mybatis-plus自定義TypeHandler查詢(xún)映射結(jié)果一直為null問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java8加java10等于Java18的版本查看及特性詳解
這篇文章主要為大家介紹了Java?8加java10等于Java18的各個(gè)版本要點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
解決pageHelper分頁(yè)失效以及如何配置問(wèn)題
這篇文章主要介紹了解決pageHelper分頁(yè)失效以及如何配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
JavaWeb中的filter過(guò)濾敏感詞匯案例詳解
敏感詞、文字過(guò)濾是一個(gè)網(wǎng)站必不可少的功能,本篇文章主要介紹了JavaWeb中的filter過(guò)濾敏感詞匯案例,具有一定的參考價(jià)值,有需要的可以了解一下,2016-11-11

