成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不要在線上濫用CopyOnWriteArrayList,姿勢不對性能真的很糟糕

開發 開發工具
JDK為我們提供了很多用于并發場景的工具類,但是仍需要我們仔細了解每一種工具的使用場景,在不合適的場景使用不合適的工具,會導致性能更差。

從JDK1.5版本,JAVA提供了線程安全的List增強版CopyOnWriteArrayList,其保持線程安全的方式是:每次修改數據時,不會直接修改數據,而是把數據復制出來一份,對復制出來的數組進行操作。

通過這樣的機制,可以極大程度的提升讀的并發性能,所以對于CopyOnWriteArrayList來說,非常適合讀多寫少或者無鎖的場景。

但是,如果我們為了炫技而不分場合濫用CopyOnWriteArrayList的話,可能會帶來適得其反的結果。

下面,我們通過一段測試代碼,比較一下CopyOnWriteArrayList和普通加鎖ArrayList的讀寫性能差距。

我們首先測試一下寫性能的差距:構建一個CopyOnWriteArrayList和synchronizedList,通過多線程并發寫入100000個元素。

List<Integer> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
//構建一個加鎖的List
List<Integer> synchronizedList = Collections.synchronizedList(new ArrayList<>());
StopWatch stopWatch = new StopWatch();
int loopCount = 100000;
stopWatch.start("測試寫性能:copyOnWriteArrayList");
//多線程寫入100000個數字
IntStream.rangeClosed(1, loopCount).parallel()
.forEach(x -> copyOnWriteArrayList.add(ThreadLocalRandom.current().nextInt(loopCount))
);
stopWatch.stop();
stopWatch.start("測試寫性能:synchronizedList");
//多線程寫入100000個數字
IntStream.rangeClosed(1, loopCount).parallel()
.forEach(x -> synchronizedList.add(ThreadLocalRandom.current().nextInt(loopCount))
);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
Map<String, Integer> result = new HashMap<>();
result.put("copyOnWriteArrayList", copyOnWriteArrayList.size());
result.put("synchronizedList", synchronizedList.size());
System.out.println(JSON.toJSONString(result));

可以清楚的看到,在大量寫的情況下,CopyOnWriteArrayList的性能是遠遠不如普通的加鎖List的,性能差距可能在100倍以上。

而之所以CopyOnWriteArrayList的寫入這么慢,就是因為CopyOnWriteArrayList每次寫入都要對存放元素的舊數組進行復制創建一個新數組,從而導致內存申請釋放消耗很大。


我們再測試一下大量讀的性能差距:先對兩個List寫入100000個元素,再通過多線程的方式隨機get元素。

List<Integer> synchronizedList = Collections.synchronizedList(new ArrayList<>());
synchronizedList.addAll(IntStream.rangeClosed(1, 100000).boxed().collect(Collectors.toList()));

List<Integer> copyOnWriteArrayList = IntStream.rangeClosed(1, 100000).boxed()
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));

StopWatch stopWatch = new StopWatch();
int loopCount = 1000000;
int count = copyOnWriteArrayList.size();
stopWatch.start("測試讀性能:copyOnWriteArrayList");
IntStream.rangeClosed(1, loopCount).parallel().forEach(
x -> copyOnWriteArrayList.get(ThreadLocalRandom.current().nextInt(count))
);
stopWatch.stop();
stopWatch.start("測試讀性能:synchronizedList");
IntStream.range(0, loopCount).parallel().forEach(
x -> synchronizedList.get(ThreadLocalRandom.current().nextInt(count))
);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
Map<String,Integer> result = new HashMap<>();
result.put("copyOnWriteArrayList", copyOnWriteArrayList.size());
result.put("synchronizedList", synchronizedList.size());
System.out.println(JSON.toJSONString(result));

經過多次測試,CopyOnWriteArrayList的讀性能大概在普通加鎖List的2-5倍左右。

而CopyOnWriteArrayList的讀之所以快,是因為CopyOnWriteArrayList讀取元素是無鎖狀態下直接按數組下標獲取。

一般來說,CopyOnWriteArrayList只適用于大量讀的場景,如果有了大量寫操作,性能反而不如普通的List。

JDK為我們提供了很多用于并發場景的工具類,但是仍需要我們仔細了解每一種工具的使用場景,在不合適的場景使用不合適的工具,會導致性能更差。

責任編輯:姜華 來源: 今日頭條
相關推薦

2018-12-29 14:45:34

RESTfulGoogleUser

2021-01-05 13:45:31

Go語言編程語言

2018-01-17 22:17:16

IT架構數據糟糕架構

2022-09-14 09:37:17

JavaScript默認導出

2012-07-16 09:41:59

項目

2012-07-16 11:27:08

項目開發

2019-11-05 09:20:06

SQLiteLinux

2009-12-09 09:48:23

IT市場失敗事件

2022-06-05 21:27:40

Reacteffect

2022-06-15 22:33:07

React逃生艙

2009-08-24 09:20:18

2021-11-26 22:14:55

PHP編程語言開發

2016-04-21 09:43:33

編程音樂

2018-10-30 12:44:04

Linux系統內存

2013-04-08 15:39:15

程序員

2010-02-23 16:21:24

Python Win

2010-03-02 17:22:46

Android技術

2025-04-16 08:20:34

2015-06-30 08:31:59

舊代碼重寫

2025-05-06 09:35:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线一区二区三区 | 欧美一区二区免费视频 | 一区二区国产精品 | 国产影音先锋 | 亚洲国产欧美国产综合一区 | 国产福利91精品一区二区三区 | 亚洲国产精品一区二区久久 | 99福利视频 | 国产免费一区 | 香蕉一区| 日韩影院一区 | www亚洲精品 | 午夜精品一区二区三区在线观看 | 中文字幕综合 | 国产yw851.c免费观看网站 | 亚洲精品大全 | 日本精品一区二区三区视频 | 亚洲综合大片69999 | 久久久久国产一区二区三区不卡 | 中文字幕成人av | 九九九久久国产免费 | 亚洲精品久久 | 亚洲国产午夜 | 久久久激情视频 | 99视频入口 | 极品电影院 | 伊人久久免费视频 | 久久久精品视 | 中文字字幕在线中文乱码范文 | 欧美精品第一区 | 亚洲欧美综合精品另类天天更新 | 色婷婷综合久久久中字幕精品久久 | 日韩一区中文字幕 | 国产真实精品久久二三区 | 国产精品美女一区二区三区 | 免费精品视频在线观看 | 天堂一区 | 欧美成人一区二区三区片免费 | 欧美日韩亚洲国产 | 久久高清 | 欧美一区二区免费视频 |