Java线程安全的集合类Map、List、Set

news/发布时间2024/5/10 17:10:09

老古董(低效,不建议用):

原理是所有操作都加同步块

// Vector
Vector<String> vector = new Vector<String>();// Hashtable
Hashtable<Integer, String> hashtable = new Hashtable<Integer, String>();

 

老古董2.0版(换汤不换药):

原理还是所有操作都加同步块

List:Collections.synchronizedList

Set:Collections.synchronizedSet

Map:Collections.synchronizedMap

这三个使用方式完全一致,以下只演示List:

// 创建一个线程不安全的ArrayList
List<String> list = new ArrayList<>();
// 将ArrayList转换为线程安全的List
List<String> synchronizedList = Collections.synchronizedList(list);// 在同步块中操作List
synchronized (synchronizedList) {synchronizedList.add("元素1");synchronizedList.add("元素2");synchronizedList.add("元素3");
}// 同步块内读取List
synchronized (synchronizedList) {for (String element : synchronizedList) {System.out.println(element);}
}

 

高效3.0:

// 原理:写时复制,每次修改操作先复制出一份新数组,在新数组上做修改,完成后把指针指向新数组。
// 修改操作加互斥锁,读操作无锁
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();// 底层使用了CopyOnWriteArrayList,Put操作调用了:addIfAbsent()保证元素不重复。
CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>();// 基于跳表(Skip List)数据结构实现,由于不需要写时复制,写入效率比ArraySet高,读取效率比ArraySet低。
ConcurrentSkipListSet<Integer> set = new ConcurrentSkipListSet<>();// ConcurrentHashMap 使用分段锁(Segment Locking)或者锁分离技术来减少锁的竞争,从而提高并发性能。
// 在 JDK 1.8 之前,ConcurrentHashMap 由多个 Segment 组成,每个 Segment 包含一个小的 HashMap,锁是针对Segment的。
// 从 JDK 1.8 开始,ConcurrentHashMap 使用了 CAS 操作和 synchronized 来实现并发控制,不再使用分段锁。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/00745763.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

主题捣鼓日记

先挖个坑,一边复习一边弄吧。主题捣鼓日记 sakura版本(YYDS)主要框架都没怎么动,功能挺完整的。但是如果要DIY还是得自己把代码捋一遍,不然从哪改起都不知道,注释不能说完全没用。。。 捣鼓了两天两夜,还是有很多细节没改好,main.js翻了四五遍,看评论区发现诸多细节还…

查找链表中倒数第k(k为正整数)个位置上的结点,查找成功输出该结点的data值,并返回1,否则只返回0

/******************************************************** name : FindKNode* function : 查找链表中倒数第k(k为正整数)个位置上的结点* 查找成功输出该结点的data值,并返回1,否则只返回0* argument* @head : 链表头结点的地址*…

作业1

已知一个顺序表,其中的元素递增有序排列,设计一个算法,插入一个元素x(x为int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。前者为课上的 后者为作业

vis.js标签条形图

代码案例<!doctype html> <html> <head><title>Timeline</title><script type="text/javascript" src="https://unpkg.com/vis-timeline@latest/standalone/umd/vis-timeline-graph2d.min.js"></script><lin…

docker下安装gitlab配置以及备份

安装 docker run --detach --publish 443:443 --publish 9980:80 --publish 9922:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab --shm-size 256m gitlab…