CopyOnWriteArrayList理解

 

雨傘CopyOnWriteArrayList,因何而存在? 數組

ArrayList的一個線程安全的變體,其全部可變操做(add、set等)都是經過對底層數組進行一次新的複製來實現的,代價昂貴。 安全

CopyOnWriteArrayList,是因」併發」而生。 併發

CopyOnWriteArrayList,改了其中的某對象的某個值, spa

【場景一】對於ArrayList,使用直接方式,一邊遍歷,一邊刪除,會報錯。 線程

// 刪除/修改元素
for(String item : list){
list.remove(item);
}

image

雨傘解決辦法一:使用迭代器,一邊遍歷,一邊刪除,不會報錯。 code

// 刪除/修改元素      
Iterator<String> it = list.iterator();      
while(it.hasNext()){      
String ele = it.next();      
it.remove();      
}      
對象

雨傘解決辦法二:使用CopyOnWriteArrayList,直接方式,一邊遍歷,一會刪除,不會報錯。 blog

for(String item : list){    
list.remove(item);    
}     ip

【場景二】對於ArrayList,使用迭代器,一邊遍歷,一邊add,會報錯。 rem

Iterator<String> it = list.iterator();    
while(it.hasNext()){    
String str = it.next();    
String tem = str + "...";    
list.add(tem);    
}    

雨傘解決辦法一:改用CopyOnWriteArrayList,直接方式,一邊遍歷,一邊add,不會報錯。

for(String item : list){    
String tem = item + "...";    
list.add(tem);    
}    

雨傘解決辦法二:改用CopyOnWriteArrayList,一邊遍歷,一邊add,不會報錯。

Iterator<String> it = list.iterator();    
while(it.hasNext()){    
String str = it.next();    
String tem = str + "...";    
list.add(tem);    
}

【場景三】對於CopyOnWriteArrayList,迭代器,不能remove。

Iterator<String> it = list.iterator();    
while(it.hasNext()){    
String str = it.next();    
String tem = str + "...";    
it.remove();    
}    

image

雨傘解決辦法一:使用直接方式,一邊遍歷,一邊add/remove()

for(String item : list){     String tem = item + "...";     list.remove(item);     list.add(tem);     }    

相關文章
相關標籤/搜索