不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很糟糕

不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很糟糕,从JDK1.5版本,JAVA提供了线程安全的List增强版CopyOnWriteArrayList,其保持线程安全的方式是:每次修改数据时,不会直接修改数据,而是把数据复制出来一份,对复制出来的数组进行操作。,通过这样的机制,可以极大程度的提升读的并发性能,所以对于CopyOnWriteArrayList来说,非常适合读多写少或者无锁的场景。,但是,如果我们为了炫技而不分场合滥用CopyOnWriteArrayList的话,可能会带来适得其反的结果。,下面,我们通过一段测试代码,比较一下CopyOnWriteArrayList和普通加锁ArrayList的读写性能差距。,我们首先测试一下写性能的差距:构建一个CopyOnWriteArrayList和synchronizedList,通过多线程并发写入100000个元素。,可以清楚的看到,在大量写的情况下,CopyOnWriteArrayList的性能是远远不如普通的加锁List的,性能差距可能在100倍以上。,不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很糟糕,而之所以CopyOnWriteArrayList的写入这么慢,就是因为CopyOnWriteArrayList每次写入都要对存放元素的旧数组进行复制创建一个新数组,从而导致内存申请释放消耗很大。,
,不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很糟糕,我们再测试一下大量读的性能差距:先对两个List写入100000个元素,再通过多线程的方式随机get元素。,经过多次测试,CopyOnWriteArrayList的读性能大概在普通加锁List的2-5倍左右。,不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很糟糕,而CopyOnWriteArrayList的读之所以快,是因为CopyOnWriteArrayList读取元素是无锁状态下直接按数组下标获取。,不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很糟糕,一般来说,CopyOnWriteArrayList只适用于大量读的场景,如果有了大量写操作,性能反而不如普通的List。,JDK为我们提供了很多用于并发场景的工具类,但是仍需要我们仔细了解每一种工具的使用场景,在不合适的场景使用不合适的工具,会导致性能更差。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/17101.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34