ArrayList是线程不安全的,因为在他的 add 方法添加元素时,为了保证并发性,没有加锁。
public class CollectionTest {
public static void main(String[] args) {
final List<String> list = new ArrayList<>();
for (int i = 0; i <20; i++) { //创建20个线程
new Thread(new Runnable() {
@Override
public void run() { //list添加随机字符串
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
}
}).start();
}
}
}
- 打印结果-- - -- - - - - - - -
java.util.ConcurrentModificationException
高并发下的修改异常
解决方案一:用 Vector 代替 ArrayList ,Vector相较于ArrayList是线程安全的,Vector 所有针对集合内元素的操作方法都是由 synchronized 修饰的。但是!!Vector 是JDK1.0引入的,ArrayList是1.2引入的。为何有线程安全的还要新出一个不安全的?
Vector 的缺点:由于加了synchronized,导致失去了并发性,效率大大下降。
解决方案二:用 Collections.synchronizedList(new ArrayList<String>()) 代替new ArrayList<String>()。
public class CollectionTest {
public static void main(String[] args) {
// final List<String> list = new ArrayList<>();
// final List<String> list = new Vector<>();
final List<String> list = Collections.synchronizedList(new ArrayList<String>());
for (int i = 0; i