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ū)別:
| 屬于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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zte机顶盒怎么设置(ZTE机顶盒设置密
- 下一篇: 使用Java从地图中删除元素