import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* User: ldj
* Date: 2023/2/23
* Time: 19:32
* Description: 集合ArrayList线程不安全解决方案
*/
public class JucListDemo {
public static void main(String[] args) {
//线程不安全,报并发修改异常 ConcurrentModificationException
List<String> stringList = new ArrayList<>();
//方案1 Vector (jdk1.0)
List<String> stringList1 = new Vector<>();
//方案2 Collections
List<String> stringList2 = Collections.synchronizedList(new ArrayList<>());
//上面两种都使用 synchronized了
//方案3 JUC.CopyOnWriteArrayList 在副本独立写,然后最后合并到正本
List<String> stringList3 = new CopyOnWriteArrayList<>();
for (int i = 0; i < 15; i++) {
new Thread(()->{
stringList3.add(Thread.currentThread().getId()+"::" + UUID.randomUUID().toString().replaceAll("-", "").substring(0,5));
System.out.println(stringList3);
},String.valueOf(i)).start();
}
}
}
package com.atguli.common.demo;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* User: ldj
* Date: 2023/2/23
* Time: 20:17
* Description: 集合HashSet线程不安全解决方案
*/
public class JucSetDemo {
public static void main(String[] args) {
Set<Object> set = new CopyOnWriteArraySet<>();
for (int i = 0; i < 15; i++) {
new Thread(()->{
set.add(Thread.currentThread().getId()+"::" + UUID.randomUUID().toString().replaceAll("-", "").substring(0,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
/**
* User: ldj
* Date: 2023/2/23
* Time: 20:14
* Description: 集合HashMap线程不安全解决方案
*/
public class JucMapDemo {
public static void main(String[] args) {
//Map<String, String> hashMap = new HashMap<>();
Map<String, String> concurrentMap = new ConcurrentHashMap<>();
for (int i = 0; i < 15; i++) {
new Thread(()->{
concurrentMap.put(Long.toString(Thread.currentThread().getId()), UUID.randomUUID().toString().replaceAll("-", "").substring(0,5));
System.out.println(concurrentMap);
},String.valueOf(i)).start();
}
}
}