集合类不安全
List不安全
package com.sw.unsafe;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* @Author suaxi
* @Date 2021/1/4 17:12
* java.util.ConcurrentModificationException 并发修改异常
*/
public class ListTest {
public static void main(String[] args) {
/*
并发情况下ArrayList不安全
解决方案:
1、List<String> list = new Vector<>();
2、List<String> list = Collections.synchronizedList(new ArrayList<>());
3、List<String> list = new CopyOnWriteArrayList<>();
CopyOnWrite 写入时复制(是一种优化策略)
多个线程调用的时候可能存在写入覆盖问题,读取没问题
CopyOnWrite在写入的时候复制一份给调用者,调用者写入新的数据完成之
后再把之前复制的数据放回原来的位置,保证线程的安全,以此避免了写入覆盖问题
相较于Vector,它没有采用synchronized锁,而是采用Lock锁,效率更高
*/
List<String> list = new CopyOnWriteArrayList<>();
for (int i = 0; i < 100; i++) {
new Thread(() ->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
Set不安全
package com.sw.unsafe;
import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @Author suaxi
* @Date 2021/1/4 22:08
* java.util.ConcurrentModificationException 并发修改异常
* 解决方法:
* 1、Set<String> set = Collections.synchronizedSet(new HashSet<>());
* 2、Set<String> set = new CopyOnWriteArraySet<>();
*/
public class SetTest {
public static void main(String[] args) {
Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 0; i < 30; i++) {
new Thread(() ->{
set.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
hashSet底层是什么?
public HashSet(){
map = new HashMap<>();
}
//源码
//set add的本质就是map
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//PRESENT是静态终类
private static final Object PRESENT = new Object();
Map不安全
package com.sw.unsafe;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Author suaxi
* @Date 2021/1/4 22:26
* java.util.ConcurrentModificationException
* 解决方法:
* Map<String, String> map = new ConcurrentHashMap<>();
*/
public class MapTest {
public static void main(String[] args) {
//默认等价于? new HashMap<>(16,0.75);
Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i < 30; i++) {
new Thread(() ->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
评论 (0)