一、ArrayList是线程不安全的,可以使用以下操作解决:
1.使用相同功能的集合类替换,比如Vector集合是线程安全的,他们实现的接口都是一样的,但是Vector类是在jdk1.0出现的,不推荐使用
2.使用 java.util.Collections类里面的静态方法synchronizedXXX(xxx),把不安全的集合当参数放进去。
3.使用java.util.concurrent.CopyOnWriteArrayList或java.util.concurrent.CopyOnWriteArraySet
二、从上面第二个知道Map与Set都是线程不安全的,其中Map的第三个解决方法是 java.util.concurrent.ConcurrentHashMap
三、代码实现
package com.jenne.mydemo; import org.junit.jupiter.api.Test; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; public class TestCollection { @Test public void testList() { /* //可能会出现java.util.ConcurrentModificationException List<String> list = new ArrayList<>(); for (int i = 1; i <= 8; i++) { new Thread(() -> { list.add(Thread.currentThread().getName()+"--->测试"); System.out.println(list); }).start(); }*/ /*List<String> list = new Vector<>();//不推荐 for (int i = 1; i <= 6; i++) { new Thread(() -> { list.add(Thread.currentThread().getName()+"--->测试"); System.out.println(list); }).start(); }*/ /*List<String> list = Collections.synchronizedList(new ArrayList<>());//不推荐 for (int i = 1; i <= 6; i++) { new Thread(() -> { list.add(Thread.currentThread().getName()+"--->测试"); System.out.println(list); }).start(); }*/ List<String> list = new CopyOnWriteArrayList<>();//推荐使用 for (int i = 1; i <= 6; i++) { new Thread(() -> { list.add(Thread.currentThread().getName() + "--->测试"); System.out.println(list); }).start(); } } @Test public void testSet() { /*//java.util.ConcurrentModificationException Set<String> set = new HashSet<>(); for (int i = 1; i <= 16; i++) { new Thread(() -> { set.add(Thread.currentThread().getName()+"--->测试"); System.out.println(set); }).start(); }*/ /* Set<String> set = Collections.synchronizedSet(new HashSet<>());//不推荐 for (int i = 1; i <= 16; i++) { new Thread(() -> { set.add(Thread.currentThread().getName()+"--->测试"); System.out.println(set); }).start(); }*/ Set<String> set = new CopyOnWriteArraySet<>();//推荐使用 for (int i = 1; i <= 16; i++) { new Thread(() -> { set.add(Thread.currentThread().getName() + "--->测试"); System.out.println(set); }).start(); } } @Test public void testMap() { /*//java.util.ConcurrentModificationException Map<String,String> map = new HashMap<>(); for (int i = 1; i <= 16; i++) { new Thread(() -> { map.put(Thread.currentThread().getName(),"--->测试"); System.out.println(map); }).start(); }*/ /*Map<String, String> map = Collections.synchronizedMap(new HashMap<>());//不推荐 for (int i = 1; i <= 16; i++) { new Thread(() -> { map.put(Thread.currentThread().getName(), "--->测试"); System.out.println(map); }).start(); }*/ Map<String,String> map = new ConcurrentHashMap<>();//推荐使用 for (int i = 1; i <= 16; i++) { new Thread(() -> { map.put(Thread.currentThread().getName(),"--->测试"); System.out.println(map); }).start(); } } }
原文:https://www.cnblogs.com/jenne-blog/p/12839719.html