ArrayList是否是线程安全?
1. 以add方法为例:
查看源码 没有加锁或其他操作
Talk is cheap. Show me the code.
10000个线程,每个线程加入10个元素, 可以发现第一打印出来,不是100000个; 第二次报错,并且值也不是100000!!!
证实:ArrayList线程不安全
2. Java提供的线程安全操作
Collections.synchronizedList(List list);
多次执行发现结果都是100000
查看源码
之所以遍历需要加锁是因为iterator方法没有加锁。
通过判断传入list是否实现RandomAccess创建不同的同步集合;以ArrayList和LinkedList为例;
继续深入发现,父类SynchronizedCollection中有变量mutex;mutex = this;在add方法中对自己加锁