线程不安全条件下的并发操作
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{
arrayList.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(arrayList);
},i+"").start();
}
}
经测试,不能再 @Test
下测试,不会有任何输出。通过上述测试,会报 java.util.ConcurrentModificationException
异常
解决方案一:使用 Vector
。List的古老实现类,JDK1.0引入
public static void main(String[] args) {
List<String> arrayList = new Vector<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
arrayList.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(arrayList);
}, i + "").start();
}
}
解决方案二:使用 Collections
工具类
public static void main(String[] args) {
List<String> arrayList = Collections.synchronizedList(new ArrayList<String>());
for (int i = 0; i < 30; i++) {
new Thread(() -> {
arrayList.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(arrayList);
}, i + "").start();
}
}
解决方案三:CopyOnWriteArrayList
写时复制技术
原理图:
public static void main(String[] args) {
CopyOnWriteArrayList<String> arrayList = new CopyOnWriteArrayList<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
arrayList.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(arrayList);
}, i + "").start();
}
}