ArrayList--应对线程不安全

一、ArrayList是线程不安全的

public class ArrayListDemo{
	
	public static void main(String[] args){

		List<String> list = new ArrayList<>();

		for(int i=0; i< 30; i++){
			new Thread(() -> {
				list.add(UUID.randomUUID().tostring().subString(0, 10));
				System.out.println(list);
			}).start();
		}
	}	
} 

多线程环境下,执行以上代码出现异常:java.util.ConcurrentModificationException

解决方式:

1. new Vector();

 原理:执行的add方法 synchronized关键字修饰

2. Collections.synchronizedArrayList(new ArrayList<>());

3. new CopyOnWriteArrayList<>();

 原理:该类的数组为volatile,add方法使用了Lock

 写时复制:

CopyOnWrite容器即写时复制的容器。往一个容器添加元素时,不再当前容器Object[]中添加,而是copy当前容器到新容器Object[] newElements,将新元素添加到新容器。添加完元素将原有容器的引用指向新容器setArray(newElements);

好处是,对CopyOnWrite容器可以并发的读,不用加锁。独写分离的思想。

二、HashSet--线程不安全

通ArrayList类似,HashSet并不是线程安全的类。

解决方案

1. Collections.synchronizedSet(new HashSet());

2. new CopyOnWriteArraySet<>()---底层实现是CopyOnWriteArrayList

  

 

 三、hashMap--线程不安全

解决方案

1. Collections.synchronizedMap(new HashMap<>());

2. ConcurrentHashMap<>();

posted @ 2020-07-15 16:37  小缓  阅读(102)  评论(0)    收藏  举报