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

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

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

前言:

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

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

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

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

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

        在迭代返回的列表時,用戶必須手動同步它。因為在執(zhí)行add()等方法的時候是加了synchronized關(guān)鍵字的,但是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 的線程安全變體,其中所有可變操作(例如添加、設(shè)置、刪除...)都是通過創(chuàng)建底層數(shù)組的單獨副本來實現(xiàn)的。它通過創(chuàng)建 List 的單獨副本來實現(xiàn)線程安全,這與 vector 或其他集合用于提供線程安全的方式不同。

  • 當我們不能或不想同步遍歷,但需要防止并發(fā)線程之間的干擾時,它很有用。
  • 這是昂貴的,因為每次寫入操作都涉及單獨的數(shù)組副本(例如添加,設(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 的其他構(gòu)造函數(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ù)組列表復(fù)制寫入數(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

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

相關(guān)文章

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

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

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

    java常見面試題及答案匯總

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

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

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

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

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

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

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

    java類中serialVersionUID的作用及其使用

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

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

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

    IDEA教程之Activiti插件圖文詳解

    這篇文章主要介紹了IDEA教程之Activiti插件圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    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

最新評論

沙雅县| 嘉禾县| 双流县| 绍兴市| 静宁县| 九龙城区| 方正县| 托克托县| 林口县| 迁西县| 基隆市| 色达县| 禹城市| 辰溪县| 齐河县| 冀州市| 龙井市| 临桂县| 乐清市| 宾川县| 郸城县| 玉环县| 广河县| 广丰县| 甘肃省| 麻江县| 富源县| 交口县| 邵阳市| 酒泉市| 额济纳旗| 离岛区| 安庆市| 庄浪县| 临江市| 专栏| 长武县| 株洲市| 崇明县| 偃师市| 晋州市|