提示:以下是本篇文章正文内容,下面案例可供参考
代码如下(示例):
public class ZZZZZZZZZZ {
public static void main(String[] args) {
// ArrList 非线程安全的集合
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {// 多个线程同时向 ArrayList 添加元素
list1.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list1);
}).start();
}
}
}
输出结果
Exception in thread “Thread-1” Exception in thread “Thread-0” Exception in thread “Thread-4” Exception in thread “Thread-25” Exception in thread “Thread-23” Exception in thread “Thread-17” Exception in thread “Thread-18” Exception in thread “Thread-27” java.util.ConcurrentModificationException
,并发修改异常,由于ArrayList 不是线程安全的容器,多个线程并发添加元素,会导致竞争现象,最终产生该异常。
故障出现
java.util.ConcurrentModificationException
导致原因
多线程并发争抢修改导致
解决方法
static <T> List<T> Collections.synchronizedList(List<T> list)
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
代码如下(示例):
public class ZZZZZZZZZZ {
public static void main(String[] args) {
// 非线程安全的 HashSet
Set<String> set = new HashSet<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(set);
}).start();
}
}
}
故障出现
java.util.ConcurrentModificationException
导致原因
多线程并发争抢修改导致
解决方法
static <T> Set<T> Collections.synchronizedList(Set<T> s)
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
代码如下(示例):
public class ZZZZZZZZZZ {
public static void main(String[] args) {
// 非线程安全的 HashMap
Map<String, String> map = new HashMap<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 8));
System.out.println(map);
}).start();
}
}
}
故障出现
java.util.ConcurrentModificationException
导致原因
多线程并发争抢修改导致
解决方法
使用线程安全的容器,如:ConcurrentHashMap
使用集合工具类的线程安全的方法,如:
static <K, V> Map<K, V> Collections.synchronizedMap(Map<K, V> m)