ArrayList
什么是ArrayList就不贅述了,主要是在多執行緒的情況下,執行緒是不安全的,原因是一條執行緒在對集合進行遍歷,然而另一條卻對陣列進行修改,那么這樣就很容易觸發ConcurrentModificationException例外,
那么解決執行緒不安全的方法有:
-
用過時的方法Vactor,同ArrayList一樣底層是一個陣列,其中大部分方法都被synchronized關鍵字所修飾,擴容方法與ArrayList不同,是2倍的擴容,
-
用Collections工具類
List<String> list = Collections.synchronizedList(new ArrayList<>()); -
CopyOnWriteArrayList
List<String> list = CopyOnWriteArrayList<>();效率高,沒有同步鎖,
CopyOnWrite
是并發的一種新思路,實作讀寫分離,在并發環境下保證了執行緒安全,如果執行緒進行寫入操作,那么它會復制一個原本的集合,在新的集合內作添加或洗掉元素操作,待修改完成之后,再將原集合的參考指向新的集合,
-
好處是,可以高并發地對COW進行讀和遍歷操作,而不需要加鎖,因為原集合不會添加任何元素,
-
壞處是,在某些時刻,記憶體占用可能會過大從而頻繁觸發GC,減低服務器性能,
-
使用COW需注意:
- 使用批量添加或洗掉方法,如addAll 或removeAll 操作,在高并發請求下,可以攢一下要添加或洗掉的元素,避免增加一個元素復制整個集合,
- 原因:假如幾何資料是200MB,再寫入10MB,那么某個時間段內占用的就達到(200MB * 2) + 10MB = 410MB,會頻繁觸發GC,
舉例說明,CopyOnWriteArrayList 到底能有慢?(根據各自電腦不同,有所差異)
ArrayList:
List list = new ArrayList();
long a = System.currentTimeMillis();
for (int i = 0; i < 20 * 10000; i++) {
list.add(i);
}
long b = System.currentTimeMillis();
long c = b - a;
System.out.println(c); // 18
CopyOnWriteArrayList:
List cow = new CopyOnWriteArrayList();
long a = System.currentTimeMillis();
for (int i = 0; i < 20 * 10000; i++) {
cow.add(i);
}
long b = System.currentTimeMillis();
long c = b - a;
System.out.println(c); // 28016

愿世上沒有Bug
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/4661.html
標籤:其他
上一篇:設計模式(8) 組合模式
下一篇:JWT的基本介紹
