JUC:6_1集合类并发问题、集合类并发不安全解决方案2:map、set
集合类并发不安全解决方案1:list
集合类并发不安全解决方案2:map、set
HashSet的本质就是HashMap,
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
代码
package juc.hashmap;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
public class Test {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
/*并发安全解决方案1:Collections(集合工具类)提供的一些安全集合类*/
// Set<String> set = Collections.synchronizedSet(new HashSet<>());
/*并发安全解决方案2:CopyOnWriteArraySet*/
// Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(Thread.currentThread().getName() + "==>" + set);
}, "set线程执行" + i).start();
}
Map<String, String> map = new HashMap<>();//等价于:Map<String, String> map1 = new HashMap<>(1<<4,0.75f);//1<<4,位运算,往左移动4位
/*并发安全解决方案1:Collections(集合工具类)提供的一些安全集合类*/
// Map<String,String> map = Collections.synchronizedMap(new HashMap<>());
/*并发安全解决方案2:ConcurrentHashMap*/
// Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
map.put(UUID.randomUUID().toString().substring(0, 8), DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date()));
System.out.println(Thread.currentThread().getName() + "==>" + map);
}, "map线程执行" + i).start();
}
}
}
报错
Exception in thread "set线程执行2" Exception in thread "set线程执行9" Exception in thread "set线程执行0" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$KeyIterator.next(HashMap.java:1469)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$KeyIterator.next(HashMap.java:1469)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$KeyIterator.next(HashMap.java:1469)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$0(Test.java:22)
at java.lang.Thread.run(Thread.java:748)
set线程执行1==>[3eb8630f, d27fe9bb, 0f7e6b22]
set线程执行7==>[3eb8630f, d27fe9bb, b13fac67, e06a4584, 0f7e6b22, c415245c]
set线程执行8==>[3eb8630f, 8d434916, d27fe9bb, b13fac67, e06a4584, 0f7e6b22, 35519a70, c415245c]
set线程执行3==>[3eb8630f, 8d434916, d27fe9bb, b13fac67, e06a4584, 0f7e6b22, 35519a70, 02deed6c, c415245c]
set线程执行5==>[3eb8630f, 8d434916, d27fe9bb, b13fac67, e06a4584, 0f7e6b22, c98d10e9, 35519a70, 02deed6c, c415245c]
set线程执行6==>[3eb8630f, d27fe9bb, b13fac67, 0f7e6b22, c415245c]
set线程执行4==>[3eb8630f, d27fe9bb, b13fac67, 0f7e6b22]
Exception in thread "map线程执行5" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at java.util.AbstractMap.toString(AbstractMap.java:554)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$1(Test.java:35)
at java.lang.Thread.run(Thread.java:748)
Exception in thread "map线程执行7" Exception in thread "map线程执行6" Exception in thread "map线程执行8" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at java.util.AbstractMap.toString(AbstractMap.java:554)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$1(Test.java:35)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at java.util.AbstractMap.toString(AbstractMap.java:554)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$1(Test.java:35)
at java.lang.Thread.run(Thread.java:748)
Exception in thread "map线程执行1" Exception in thread "map线程执行0" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at java.util.AbstractMap.toString(AbstractMap.java:554)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$1(Test.java:35)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at java.util.AbstractMap.toString(AbstractMap.java:554)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$1(Test.java:35)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at java.util.AbstractMap.toString(AbstractMap.java:554)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at juc.hashmap.Test.lambda$main$1(Test.java:35)
at java.lang.Thread.run(Thread.java:748)
map线程执行4==>{3d31715e=2022-03-20T19:54:54, f8d1523a=2022-03-20T19:54:54, 03895c72=2022-03-20T19:54:54, 73c3295f=2022-03-20T19:54:54, fba70c52=2022-03-20T19:54:54}
map线程执行3==>{3d31715e=2022-03-20T19:54:54, f8d1523a=2022-03-20T19:54:54, 03895c72=2022-03-20T19:54:54, 19872028=2022-03-20T19:54:54, 4b00f689=2022-03-20T19:54:54, 73c3295f=2022-03-20T19:54:54, fba70c52=2022-03-20T19:54:54}
map线程执行9==>{03895c72=2022-03-20T19:54:54, 19872028=2022-03-20T19:54:54, 4b00f689=2022-03-20T19:54:54, fba70c52=2022-03-20T19:54:54, 3d31715e=2022-03-20T19:54:54, f8d1523a=2022-03-20T19:54:54, a652aaec=2022-03-20T19:54:54, 73c3295f=2022-03-20T19:54:54}
map线程执行2==>{a22b2cd0=2022-03-20T19:54:54, 03895c72=2022-03-20T19:54:54, 19872028=2022-03-20T19:54:54, 4b00f689=2022-03-20T19:54:54, fba70c52=2022-03-20T19:54:54, e60199d5=2022-03-20T19:54:54, 3d31715e=2022-03-20T19:54:54, f8d1523a=2022-03-20T19:54:54, a652aaec=2022-03-20T19:54:54, 73c3295f=2022-03-20T19:54:54}