集合安全

​​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();
}
}
}

JUC--集合安全大全详解_i++

java.util.ConcurrentModificationException并发修改异常!

解决方案

  1. List<String>list=newVector<>();
  2. List<String>list=Collections.synchronizedList(newArrayList<>());、
  3. List<String>list=newCopyOnWriteArrayList<>();

copyOnwrite 写入时复制, COW是计算机程序设计领域的一种优化策略

多个线程调用的时候,list 读取的时候,固定,写入(覆盖)

在写入时候,避免覆盖,照成数据问题

读写分离

​CopyOnWriteArrayList​​​比​​Vector​​好在哪里?

Vector有synchronized锁 ​​CopyOnWriteArrayList​​是读写分离的效率高

JUC--集合安全大全详解_并发编程_02

set安全

JUC--集合安全大全详解_并发编程_03

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的知识点​​

JUC--集合安全大全详解_i++_04