最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中ArrayList同步的2種方法分享

 更新時間:2022年03月17日 16:44:04   作者:小鋒學長生活大爆炸  
這篇文章主要分享了Java中ArrayList同步的2種方法,Collections.synchronizedList()的方法,這個方法要進行串行訪問以及使用CopyOnWriteArrayList,下面分享內(nèi)容需要的小伙伴可以參考一下

前言:

        arrayList 的實現(xiàn)是默認不同步的。這意味著如果一個線程在結構上修改它并且多個線程同時訪問它,它必須在外部同步。結構修改意味著從列表中添加或刪除元素或顯式調整后備數(shù)組的大小。改變現(xiàn)有元素的值不是結構修改。

有兩種方法可以創(chuàng)建同步Arraylist:

  • 1. Collections.synchronizedList() 方法。
  • 2. 使用 CopyOnWriteArrayList。

方法1:使用 Collections.synchronizedList() 方法

        要進行串行訪問,必須通過返回列表完成對后備列表的所有訪問。

        在迭代返回的列表時,用戶必須手動同步它。因為在執(zhí)行add()等方法的時候是加了synchronized關鍵字的,但是iterator()卻沒有加。所以在使用的時候需要加上synchronized。

// Java program to demonstrate working of
// Collections.synchronizedList
import java.util.*;
?
class GFG
{
?? ?public static void main (String[] args)
?? ?{
?? ??? ?List<String> list =
?? ??? ?Collections.synchronizedList(new ArrayList<String>());
?
?? ??? ?list.add("practice");
?? ??? ?list.add("code");
?? ??? ?list.add("quiz");
?
?? ??? ?synchronized(list)
?? ??? ?{
?? ??? ??? ?// must be in synchronized block
?? ??? ??? ?Iterator it = list.iterator();
?
?? ??? ??? ?while (it.hasNext())
?? ??? ??? ??? ?System.out.println(it.next());
?? ??? ?}
?? ?}
}

方法 2:使用 CopyOnWriteArrayList

        ArrayList 的線程安全變體,其中所有可變操作(例如添加、設置、刪除...)都是通過創(chuàng)建底層數(shù)組的單獨副本來實現(xiàn)的。它通過創(chuàng)建 List 的單獨副本來實現(xiàn)線程安全,這與 vector 或其他集合用于提供線程安全的方式不同。

  • 當我們不能或不想同步遍歷,但需要防止并發(fā)線程之間的干擾時,它很有用。
  • 這是昂貴的,因為每次寫入操作都涉及單獨的數(shù)組副本(例如添加,設置,刪除......)
  • 當你有List并且需要遍歷它的元素并且不經(jīng)常修改它時,它是非常有效的。

        即使在創(chuàng)建迭代器后修改了 copyOnWriteArrayList,迭代器也不會拋出ConcurrentModificationException,因為迭代器正在迭代 ArrayList 的單獨副本,而寫操作正在 ArrayList 的另一個副本上發(fā)生。

// Java program to illustrate the thread-safe ArrayList.
import java.io.*;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
?
class GFG
{
?? ?public static void main (String[] args)
?? ?{
?? ??? ?// creating a thread-safe Arraylist.
?? ??? ?CopyOnWriteArrayList<String> threadSafeList
?? ??? ??? ?= new CopyOnWriteArrayList<String>();
?
?? ??? ?// Adding elements to synchronized ArrayList
?? ??? ?threadSafeList.add("geek");
?? ??? ?threadSafeList.add("code");
?? ??? ?threadSafeList.add("practice");
?
?? ??? ?System.out.println("Elements of synchronized ArrayList :");
?
?? ??? ?// Iterating on the synchronized ArrayList using iterator.
?? ??? ?Iterator<String> it = threadSafeList.iterator();
?
?? ??? ?while (it.hasNext())
?? ??? ??? ?System.out.println(it.next());
?? ?}
}

如果我們嘗試通過迭代器自己的方法修改 CopyOnWriteArrayList 會發(fā)生什么?

        如果您嘗試通過迭代器自己的方法(例如 add()、set()、remove())修改CopyOnWriteArrayList,它會拋出 UnsupportedOperationException 。

// Java program to illustrate the thread-safe ArrayList
import java.io.*;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
?
class GFG
{
?? ?public static void main (String[] args)
?? ?{
?? ??? ?// creating a thread-safe Arraylist.
?? ??? ?CopyOnWriteArrayList<String> threadSafeList =
?? ??? ??? ?new CopyOnWriteArrayList<String>();
?
?? ??? ?// Adding elements to synchronized ArrayList
?? ??? ?threadSafeList.add("geek");
?? ??? ?threadSafeList.add("code");
?? ??? ?threadSafeList.add("practice");
?
?? ??? ?System.out.println("Elements of synchronized ArrayList :");
?
?? ??? ?// Iterating on the synchronized ArrayList using iterator.
?? ??? ?Iterator<String> it = threadSafeList.iterator();
?
?? ??? ?while (it.hasNext())
?? ??? ?{
?? ??? ??? ?String str = it.next();
?? ??? ??? ?it.remove();
?? ??? ?}
?? ?}
}

CopyOnWriteArrayList 的其他構造函數(shù):

  • 1. CopyOnWriteArrayList(Collection<? extends E> c):創(chuàng)建一個包含指定集合元素的列表,按照集合迭代器返回的順序。
  • 2. CopyOnWriteArrayList(E[] toCopyIn):創(chuàng)建一個包含給定數(shù)組副本的列表。

向量同步時為什么要使用arrayList?

  • 性能: Vector 是同步和線程安全的,因此,它比 ArrayList 稍慢。
  • 功能: Vector 在每個單獨的操作級別進行同步。通常,程序員喜歡同步整個操作序列。同步單個操作既不安全又慢。
  • Vectors obsolete:向量被認為是過時的,并且在 java 中被非正式地棄用。此外,vector 對幾乎從未完成的每個單獨操作進行同步。大多數(shù)java程序員更喜歡使用ArrayList,因為如果他們需要進行同步,他們可能無論如何都會顯式地同步arrayList。

以下是 Java 中 ArrayList CopyOnWriteArrayList 類之間的顯著差異。

 數(shù)組列表復制寫入數(shù)組列表
同步ArrayList 不同步。CopyOnWriteArrayList 是同步的。
線程安全ArrayList 不是線程安全的。CopyOnWriteArrayList 是線程安全的。
迭代器類型ArrayList 迭代器是快速失敗的,如果在迭代過程中發(fā)生并發(fā)修改,則 ArrayList 會拋出 ConcurrentModificationException。CopyOnWriteArrayList 是故障安全的,它在迭代過程中永遠不會拋出 ConcurrentModificationException。其背后的原因是 CopyOnWriteArrayList 每次修改時都會創(chuàng)建一個新的數(shù)組列表。
刪除操作ArrayList 迭代器支持在迭代過程中移除元素。如果在迭代期間嘗試刪除元素,則 CopyOnWriteArrayList.remove() 方法會引發(fā)異常。
表現(xiàn)ArrayList 更快。CopyOnWriteArrayList 比 ArrayList 慢。
從 Java 版本開始1.21.5

到此這篇關于Java中ArrayList同步的2種方法分享的文章就介紹到這了,更多相關Java中ArrayList同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用IDEA如何打包發(fā)布SpringBoot并部署到云服務器

    使用IDEA如何打包發(fā)布SpringBoot并部署到云服務器

    這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java常見面試題及答案匯總

    java常見面試題及答案匯總

    本文提供Java面試題集錦,涵蓋封裝、繼承、多態(tài)等核心概念,旨在幫助求職者全面復習,提升面試表現(xiàn),從基礎知識到實際應用,內(nèi)容豐富,適合各類求職者,需要的朋友可以參考下
    2024-09-09
  • SpringBoot整合spring-retry實現(xiàn)接口請求重試機制及注意事項

    SpringBoot整合spring-retry實現(xiàn)接口請求重試機制及注意事項

    今天通過本文給大家介紹我們應該如何使用SpringBoot來整合spring-retry組件實現(xiàn)重試機制及注意事項,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-08-08
  • 關于動態(tài)參數(shù)使用@PathVariable的解析

    關于動態(tài)參數(shù)使用@PathVariable的解析

    這篇文章主要介紹了關于動態(tài)參數(shù)使用@PathVariable的解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java項目中大批量數(shù)據(jù)查詢導致OOM的解決

    Java項目中大批量數(shù)據(jù)查詢導致OOM的解決

    本文主要介紹了Java項目中大批量數(shù)據(jù)查詢導致OOM的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • java類中serialVersionUID的作用及其使用

    java類中serialVersionUID的作用及其使用

    這篇文章主要介紹了java類中serialVersionUID的作用及其使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • java實現(xiàn)服務器巡查的代碼

    java實現(xiàn)服務器巡查的代碼

    接到上級領導任務,需要實現(xiàn)一個這樣的需求,一大批服務器,需要檢查服務器能否ping通,ssh密碼是否正常,以及檢查服務器的cpu,內(nèi)存,硬盤占用情況,下面通過java代碼實現(xiàn)服務器巡查功能,需要的朋友一起看看吧
    2021-12-12
  • IDEA教程之Activiti插件圖文詳解

    IDEA教程之Activiti插件圖文詳解

    這篇文章主要介紹了IDEA教程之Activiti插件圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot2.x配置多數(shù)據(jù)源方式

    SpringBoot2.x配置多數(shù)據(jù)源方式

    這篇文章主要介紹了SpringBoot2.x配置多數(shù)據(jù)源方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java中使用Apache POI讀取word文件簡單示例

    Java中使用Apache POI讀取word文件簡單示例

    這篇文章主要介紹了Java中使用Apache POI讀取word文件簡單示例,本文著重介紹了一些必要條件,然后給出一個簡單讀取示例,需要的朋友可以參考下
    2015-06-06

最新評論

裕民县| 遵化市| 庆安县| 金秀| 平舆县| 新闻| 永康市| 将乐县| 界首市| 仁化县| 日土县| 柞水县| 阿合奇县| 穆棱市| 雷州市| 泉州市| 保定市| 历史| 北流市| 新泰市| 阜阳市| 中宁县| 凤庆县| 辉县市| 五原县| 渝中区| 永新县| 铁力市| 贵州省| 喜德县| 承德市| 禄丰县| 定南县| 聂拉木县| 金门县| 武清区| 南岸区| 澜沧| 灵宝市| 衡山县| 思南县|