我们已经知道多线程下会有各种不安全的问题,都知道并发的基本解决方案,这里对出现错误的情况进行一个实际模拟,以此能够联想到具体的生产环境中。
1|0一、List 的不安全
1|11.1 问题
看一段代码:
public static void main(String
[] args) { ArrayList<String>
list =
new ArrayList<>
(); for (
int i =
0; i <
3; i++){
new Thread(()->{
list.add(UUID.randomUUID().
toString().substring(
0,
8)); System.out.println(
list); },String.valueOf(
i)).start
(); } }
过程很简单,只有 3 个线程而已,对同一个 list 进行 add 的写操作,并随后进行输出的读操作。
输出结果,多执行几次,惊喜多多。
那么,情况不严重的时候,这里显然还正常运行结束了,只是导致了还没来得及写的时候,就已经读出了数据。
如果把线程数增加试试,可能还会看到这样的奇观:
报错了:重点异常:java.util.ConcurrentModificationException,翻译过来就是并发修改异常。
1|21.2 产生原因
普通的 ArrayList 集合里面没有任何特殊处理,在多线程情况下,他们可以共同进行访问