1、ArrayList线程异常演示
- java.util.ConcurrentModificationException——>并发修改异常
为什么会出现异常?
public class ArrayListDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();for(int i=1;i<=30;i++) {new Thread(() -> {//往集合中添加数据list.add(UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(list);},String.valueOf(i)).start();}}}
2、ArrayList线程安全解决方案
1、Vector
版本古老使用情况不多 ```java public class ArrayListDemo { public static void main(String[] args) {
// ArrayList
List<String> list = new Vector<>();for(int i=1;i<=30;i++) {new Thread(() -> {//往集合中添加数据list.add(UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(list);},String.valueOf(i)).start();}}
}
<a name="DlhUT"></a>### 2、Collections```javapublic class ArrayListDemo {public static void main(String[] args) {// ArrayList<String> list = new ArrayList<>();//Vector解决方案// List<String> list = new Vector<>();//Collections解决方案List<String> list= Collections.synchronizedList(new ArrayList<>());for(int i=1;i<=30;i++) {new Thread(() -> {//往集合中添加数据list.add(UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(list);},String.valueOf(i)).start();}}}
3、CopyOnWriteArrayList
在往集合中添加数据时,先将结合复制一份,往复制的集合中添加新的内容后,再将复制集合中的内容覆盖到原来的集合中。
public class ArrayListDemo {public static void main(String[] args) {// ArrayList<String> list = new ArrayList<>();//Vector解决方案// List<String> list = new Vector<>();//Collections解决方案// List<String> list= Collections.synchronizedList(new ArrayList<>());List<String> list=new CopyOnWriteArrayList<>();for(int i=1;i<=30;i++) {new Thread(() -> {//往集合中添加数据list.add(UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(list);},String.valueOf(i)).start();}}}
3、HashSet
1、异常演示
public class SetDemo {public static void main(String[] args) {Set set=new HashSet();for(int i=1;i<=30;i++) {new Thread(() -> {//往集合中添加数据set.add(UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(set);},String.valueOf(i)).start();}}}
2、CopyOnWriteArraySet
public class SetDemo {public static void main(String[] args) {// Set set=new HashSet();Set set=new CopyOnWriteArraySet();for(int i=1;i<=30;i++) {new Thread(() -> {//往集合中添加数据set.add(UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(set);},String.valueOf(i)).start();}}}
4、HashMap
1、异常演示
public class HashMapDemo {public static void main(String[] args) {Map map=new HashMap();for(int i=1;i<=30;i++) {int finalI = i;new Thread(() -> {String key=String.valueOf(finalI);//往集合中添加数据map.put(key,UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(map);},String.valueOf(i)).start();}}}
2、ConcurrentHashMap
public class HashMapDemo {public static void main(String[] args) {// Map map=new HashMap();Map<String,Object> map=new ConcurrentHashMap();for(int i=1;i<=30;i++) {int finalI = i;new Thread(() -> {String key=String.valueOf(finalI);//往集合中添加数据map.put(key,UUID.randomUUID().toString().substring(0, 8));//往集合中取数据System.out.println(map);},String.valueOf(i)).start();}}}

