多线程环境下安全的集合
List
/**
* 并发修改异常 多个线程同时操作一个不安全的集合
* <p>
* CopyOnWriteArrayList 写时复制技术
* add方法会先复制一个新数组 对新数组进行相关操作 操作完成之后合并到原数组去 独立写
*/
public class Demo01 {
public static void main(String[] args) {
//List list = new ArrayList(); //不安全
//List<String> list = new Vector<>(); //安全
//List<String> list = Collections.synchronizedList(new ArrayList<>()); //安全
List<String> list = new CopyOnWriteArrayList<>();//安全
for (int i = 0; i < 20; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
Set
/**
* set 集合 多线程安全解决
*/
public class Demo02 {
public static void main(String[] args) {
//Set<String> set = new HashSet<>();//不安全
Set<String> set = new CopyOnWriteArraySet<>(); //安全
for (int i = 0; i < 20; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(set);
}, String.valueOf(i)).start();
}
}
}
Map
/**
* map 集合 多线程环境安全解决方案
*/
public class Demo03 {
public static void main(String[] args) {
//Map<String, String> map = new HashMap<>();
Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i < 20; i++) {
String key = String.valueOf(i);
new Thread(() -> {
map.put(key,UUID.randomUUID().toString().substring(0, 8));
System.out.println(map);
}, String.valueOf(i)).start();
}
}
}
标签:String,list,安全,集合,new,多线程,public
From: https://www.cnblogs.com/yishan99/p/16734324.html