ArrayList、HashSet、HashMap是我们常用的三个集合,但是如果同一个集合对象被多个线程调用时,很容易出现
Java.util.ConcurrentModificationException
并发修改异常
一、解决ArrayList并发问题
有如下解决方案
Vector | Collections.synchronizedList() | CopyOnWriteArrayList() | |
---|---|---|---|
原理 | synchronized | synchronized | Lock |
相对性能 | 低 | 低 | 高 |
public static void main(String[] args) {
/**
* List<String> list = new ArrayList<>(); 不安全
* 【解决方案】
* 1、List<String> list = Collections.synchronizedList(new ArrayList<>());
* 2、List<String> list = new Vector<>();
* 3、List<String> list = new CopyOnWriteArrayList<>();
*/
List<String> list = new CopyOnWriteArrayList<>();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(list);
}).start();
}
}
复制
二、解决HashSet并发问题
有如下解决方案
Collections.synchronizedSet() | CopyOnWriteArraySet() | |
---|---|---|
原理 | synchronized | Lock |
相对性能 | 低 | 高 |
public static void main(String[] args) {
/**
* Set<String> set = new HashSet<>(); 不安全
* 【解决方案】
* 1、Set<String> set = Collections.synchronizedSet(new HashSet<>());
* 2、Set<String> set = new CopyOnWriteArraySet<>();
*/
Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(set);
}).start();
}
}
复制
三、解决HashMap并发问题
有如下解决方案
HashTable | Collections.synchronizedMap() | ConcurrentHashMap() | |
---|---|---|---|
原理 | synchronized | synchronized | Lock |
相对性能 | 低 | 低 | 高 |
public static void main(String[] args) {
/**
* Map<String> map = new HashMap<>(); 不安全
* 【解决方案】
* 1、
* 2、Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
* 3、Map<String, String> set = new ConcurrentHashMap<>();
*/
Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
}).start();
}
}
复制
好啦,以上!
最后修改时间:2022-05-13 08:55:07
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
您好,您的文章已入选墨力原创作者计划合格奖,10墨值奖励已经到账请查收!
❤️我们还会实时派发您的流量收益。
2年前

评论
相关阅读
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
阿里巴巴中间件
57次阅读
2025-04-08 11:01:30
java项目选择云服务器怎么选?
云知识CLOUD
29次阅读
2025-04-09 20:02:37
瞧瞧别人家的判空,那叫一个优雅!
jinchanchanwaji
18次阅读
2025-04-03 14:56:21
Java反射大揭秘:程序员的“偷窥”与“开挂”指南
让天下没有难学的编程
18次阅读
2025-03-28 15:02:40
Java数据库连接池学习
淡定
17次阅读
2025-04-14 22:46:26
Java反射大揭秘:程序员的“偷窥”与“开挂”指南
让天下没有难学的编程
11次阅读
2025-03-23 22:09:15
【JVM祖传手艺大揭秘】双亲委派:Java世界的"啃老"生存法则
让天下没有难学的编程
10次阅读
2025-04-09 11:01:12
面试官:Java反射和new效率对比,差距有多大?
捡田螺的小男孩
6次阅读
2025-04-13 10:34:43
Java萌新修炼手册①:开局一把JDK,环境搭建全靠浪!
让天下没有难学的编程
3次阅读
2025-04-21 10:34:37
Java萌新修炼手册②:Hello Worldの108种写法——从入门到入坟!
让天下没有难学的编程
3次阅读
2025-04-21 10:34:36
TA的专栏
Java中间件
收录0篇内容
热门文章
一次Connection reset by peer的问题排查
2021-12-07 33885浏览
Java8-Stream: no instance(s) of type variable(s) R exist so that void conforms to R
2021-02-19 32342浏览
nginx: [emerg] "user" directive is not allowed here in /etc/nginx/conf.d/nginx.conf:1
2022-02-15 24244浏览
ORA-00904: "POLTYP": invalid identifier
2019-06-19 12928浏览
PageHelper排坑,处理排序失败: net.sf.jsqlparser.JSQLParserException
2022-05-19 12757浏览
目录