并发容器(一)CopyOnWriteArrayList

news/2024/12/14 8:37:31/

我们知道,ArrayList,LikedList,HashMap都是线程不安全的容器

同步容器:Vector,HashTable,SynchronizedList是线程安全的,因为里面加了synchronized同步,所以这样的容器也叫同步容器,这样的容器在高并发的情况下性能会很低,相当于并发的线程串行化执行了。

JUC提供了一些并发容器:今天来看看CopyOnWriteArrayList

CopyOnWriteArrayList适合读多写少的场景,对实时性要求不高的业务可以用。

先来看一段代码:

public class ArrayListDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList();
//        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList();list.add("fox");list.add("mark");list.add("周瑜");new Thread(()->list.add("诸葛")).start();for (String str : list) {System.out.println(str);}}
}

遍历ArrayList的时候,对ArrayList进行set、add、remove都会报错:java.util.ConcurrentModificationException

 将ArrayList改成CopyOnWriteArrayList就不会有这个问题。

为什么呢?

以add(o)方法为例,看看源码:add属于写操作,是需要上独享锁的,这里的锁可能根据jdk版本的不同而不同,jdk11用的是synchronized关键字,  jdk8用的是可重入锁。

底层是写时复制机制。

CopyOnWriteArrayList底层用的是数组来存储数据,流程图如下:

 总结来说就是新建了一个新的数组,数据和原来数组元素一样,读(get)是不加锁的而且读的是原来的旧数组,写操作是操作的新数组。

CopyOnWriteArrayList的缺点:不适合大量数据量的场景(如数据量太大会一起OOM或者FullGC);只能保证数据的最终一致性。

应用:nacos缓存注册信息,黑名单的判断等等。


http://www.ppmy.cn/news/738450.html

相关文章

计算机考试可以用华为m6吗,华为m6可以当笔记本用吗

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 华为M6可以承担笔记本的部分使用场景&#xff0c;包括日常的文字工作以及影音娱乐等。华为M6设计有【电脑模式】&#xff0c;开启后可外接键盘使用。如果日常笔记本用途还涵盖了模型…

Docker网络模型以及容器网络初探(一)

〇、前言 安装Docker时&#xff0c;它会自动创建三个网络&#xff0c;默认bridge网桥&#xff08;创建容器默认连接到此网络&#xff09;、 none 、host。各个方式有各自的特点&#xff0c;它们有着特定的差距&#xff0c;比如网络性能等&#xff0c;一般按照实际应用方式手动…

ts全局类型(interface)

引入全局interface 首先先创建全局类型文件 命名以 xxx.d.ts 结尾 在项目中找到 tsconfig.json 配置文件 在 compilerOptions 下添加typeRoot属性&#xff0c;值为新创建的文件路径。 项目启动的时候就会自动读取该文件。 文件内容 declare xxx {interface xxx {...} } …

查看IPC网络摄像机设备型号

通过cat proc/umap/vpss查看设备型号&#xff0c;然后进行PQTool连接。

摄像镜头型号参数分类

序号型号参数参数1ov767030w像素CMOS VGA2ov772530w像素 序号型号参数1ov2640200w像素 序号型号参数1ov5460500w像素&#xff08;支持二维码识别&#xff09;

树莓派安装mplayer,并使用命令查看摄像头

树莓派安装mplayer&#xff0c;并使用命令查看摄像头 1.安装mplayer 输入命令&#xff1a;sudo apt-get install mplayer 2.查看摄像头 输入命令&#xff1a; mplayer tv:// -tv driverv4l2:device/dev/video0:input0:outfmtbgr24:width640:height480:fps25 -vo x11

vue获取摄像头

主要就是用到navigator对象&#xff08;各个浏览器基本上都支持该对象&#xff0c;多以无需引入其他文件也不用声明&#xff0c;直接在文件中使用&#xff09;&#xff0c;结合html5新增的<video>和<canvas>两个标签完成&#xff0c; navigator.mediaDevices 返回…

树莓派4b摄像头使能

接着前面的写&#xff0c;我用的是Ubuntu mate 20.4. 假如是 raspberry pi系统&#xff0c;直接进行第4步即可。 首先把摄像头安装在板子上。也没什么介绍的。 然后再终端安装raspi-config&#xff0c;可能apt不能直接安装&#xff0c;找不到这个包。那就来手动安装一下吧。…