日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的CopyOnWriteArrayList

發(fā)布時間:2023/12/3 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的CopyOnWriteArrayList 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹:

Java中的CopyOnWriteArrayList是List接口的線程安全實現。 它屬于java.util.concurrent包,是ArrayList實現的增強版本。

顧名思義, CopyOnWriteArrayList為每個add()或set()操作創(chuàng)建基礎ArrayList的克隆內部副本。 由于這種額外的開銷成本,理想情況下,僅當我們具有非常頻繁的讀取操作且插入或更新次數不多時,才應使用CopyOnWriteArrayList 。

構造一個

我們可以使用以下構造函數之一來創(chuàng)建CopyOnWriteArrayList :

  • CopyOnWriteArrayList():創(chuàng)建一個空列表
  • CopyOnWriteArrayList(Collection c):創(chuàng)建一個用c中所有元素初始化的列表
  • CopyOnWriteArrayList(Object [] obj):創(chuàng)建一個列表,其中包含給定數組obj的副本

讓我們看幾個例子:

Java

CopyOnWriteArrayList<String> emptyList = new CopyOnWriteArrayList<>(); //[]list.add("A");CopyOnWriteArrayList<String> listUsingCollection =new CopyOnWriteArrayList<>(list); //["A"]CopyOnWriteArrayList<String> listUsingArr = new CopyOnWriteArrayList<>(new String[] {"A", "B"}); //["A", "B"]

就像ArrayList一樣 ,它為List接口的所有方法提供實現。 我們可以在此處閱讀有關ArrayList的更多信息。

眾所周知, ArrayList的迭代器是快速失敗的,即一旦實例化迭代器,當它在列表中檢測到任何修改時,它將拋出ConcurrentModificationException 。

CopyOnWriteArrayList具有故障保護迭代器,即使在迭代過程中修改列表時也不會引發(fā)異常。 這是因為迭代器正在原始列表的克隆內部副本上進行操作。

但是,以后對列表所做的任何修改對于已實例化的迭代器都是不可見的。

讓我們嘗試一下

假設我們有一個CopyOnWriteArrayList實例,該實例當前包含兩個元素:

Java

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(new String[] {"A", "B"});

現在,讓我們獲得一個Iterator實例,以便能夠對其元素進行迭代:

Java

Iterator itr = list.iterator();

創(chuàng)建Iterator實例之后,現在讓我們向列表中再添加一個元素:

Java

list.add("C"); //doesn't throw an exception

現在,讓我們使用之前創(chuàng)建的itr遍歷列表中的元素:

Java

while(itr.hasNext()) {System.out.print(itr.next() + " "); }

上面的代碼將打印:

A B

正如預期的那樣,ITR不能反映表的當前狀態(tài),并只打印“A”和“B”為元素。 但是,如果我們創(chuàng)建迭代器的新實例,則它將代表列表的確切當前狀態(tài)。

CopyOnWriteArrayList的 Iterator不支持remove()操作。 任何嘗試這樣做都會導致UnsupportedOperationException:

Java

@Test(expected = UnsupportedOperationException.class) public void iterationAndRemoval() {CopyOnWriteArrayList<String> list= new CopyOnWriteArrayList<>(new String[]{"A", "B"});Iterator<String> itr = list.iterator();while (itr.hasNext()) {itr.remove();} }

讓我們回顧一下Java ArrayList和CopyOnWriteArrayList類之間的區(qū)別:

數組列表 CopyOnWriteArrayList
屬于java.util包,并且不是線程安全的 是線程安全的實現,并存在于java.util.concurrent包中
具有快速失敗的迭代器,一旦迭代開始,它會在檢測到任何修改時引發(fā)ConcurrentModificationException 有一個故障保護迭代器,因為該迭代器保存列表的克隆副本
迭代器支持remove()操作 它的迭代器不支持remove(),并且任何嘗試都拋出UnsupportedOperationException。

結論:

在本教程中,我們了解了Java List的線程安全實現– CopyOnWriteArrayList 。 我們還介紹了ArrayList和CopyOnWriteArrayList之間的區(qū)別。

成為第一個發(fā)表評論的人。

翻譯自: https://www.javacodegeeks.com/2019/03/copyonwritearraylist-java.html

總結

以上是生活随笔為你收集整理的Java中的CopyOnWriteArrayList的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。