JUC--集合安全大全详解
原创
©著作权归作者所有:来自51CTO博客作者靠谱的大钊的原创作品,请联系作者获取转载授权,否则将追究法律责任
集合安全
java中hashmap多线程并发问题详解
HashMap多线程操作下的问题总结
ConcurrentHashMap & HashTable的知识点
LIst
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
java.util.ConcurrentModificationException并发修改异常!
解决方案
- List<String>list=newVector<>();
- List<String>list=Collections.synchronizedList(newArrayList<>());、
- List<String>list=newCopyOnWriteArrayList<>();
copyOnwrite 写入时复制, COW是计算机程序设计领域的一种优化策略
多个线程调用的时候,list 读取的时候,固定,写入(覆盖)
在写入时候,避免覆盖,照成数据问题
读写分离
CopyOnWriteArrayList
比Vector
好在哪里?
Vector有synchronized锁 CopyOnWriteArrayList
是读写分离的效率高
set安全
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
for (int i = 1; i <=30 ; i++) {
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
同理
ConcurrentModificationException
解决方案
* //1、Set<String> set = Collections.synchronizedSet(new HashSet<>());
* //2、Set<String> set = new CopyOnWriteArraySet<>();
Map
// map 是这样用的吗? 不是,工作中不用 HashMap
// 默认等价于什么? new HashMap<>(16,0.75);
// Map<String, String> map = new HashMap<>();
public class MapTest {
public static void main(String[] args) {
// map 是这样用的吗? 不是,工作中不用 HashMap
// 默认等价于什么? new HashMap<>(16,0.75);
// Map<String, String> map = new HashMap<>();
// 唯一的一个家庭作业:研究ConcurrentHashMap的原理
Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 1; i <=30; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
java中hashmap多线程并发问题详解
HashMap多线程操作下的问题总结
ConcurrentHashMap & HashTable的知识点