并发编程基础-集合的线程安全
# 集合的线程安全
# 1. ArrayList集合线程不安全
此处以List集合为例
# 1.1 问题演示 😱
public class ThreadDemo5 {
public static void main(String[] args) {
// 创建ArrayList集合
List<String> list = new ArrayList<>();
for (int i = 0; i <30; i++) {
new Thread(()->{
// 向集合添加内容
list.add(UUID.randomUUID().toString().substring(0,8));
// 从集合获取内容
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
结果:java.util.ConcurrentModificationException
点击查看
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28, 95418d0f, 38d7484b, bfc664f7, d5a7db5b, bce05b31]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28, 95418d0f, 38d7484b, bfc664f7, d5a7db5b, bce05b31, c6f4adf0, 7e83541e]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28, 95418d0f, 38d7484b, bfc664f7, d5a7db5b, bce05b31, c6f4adf0, 7e83541e, b1e49e3b, b802ca6f, 9ffebd89, 0e69e4c8, 58f52687]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28, 95418d0f, 38d7484b, bfc664f7, d5a7db5b, bce05b31, c6f4adf0, 7e83541e, b1e49e3b, b802ca6f, 9ffebd89, 0e69e4c8]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28, 95418d0f, 38d7484b, bfc664f7, d5a7db5b, bce05b31, c6f4adf0]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28, 95418d0f, 38d7484b, bfc664f7, d5a7db5b]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5, 63bb1b28, 95418d0f, 38d7484b, bfc664f7]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203, d6d5e45b, 8a6fdc5d, c1d53ed5]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361, ce981203]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481, ed81c3d4, 0b785361]
[e0d7ca43, 675a7807, 1d4f5dc8, b8dd0cdf, 78eafedd, f97f364d, 8545f8b6, 57f7281b, 714a3318, 92f9b481]
Exception in thread "18" Exception in thread "27" Exception in thread "26" Exception in thread "25" Exception in thread "19" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:28)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:28)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:28)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:28)
at java.lang.Thread.run(Thread.java:748)
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:28)
at java.lang.Thread.run(Thread.java:748)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 产生原因
根据结果可以看出,有异常结果。产生原因ArrayList
集合的add()
没有加上synchronized
的关键字,线程不安全。
# 1.2 解决方案-Vector
注意
Vector方式比较古老,从1.0版本就开始的。不推荐使用
Vector 是矢量队列,它是 JDK1.0 版本添加的类。继承于 AbstractList,实现了 List, RandomAccess, Cloneable 这些接口。 Vector 继承了 AbstractList,实现了 List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功****能。**
Vector 实现了 RandmoAccess 接口,即提供了随机访问功能。RandmoAccess 是 java 中用来被 List 实现,为 List 提供快速访问功能的。在Vector 中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。 Vector 实现了 Cloneable 接口,即实现 clone()函数。它能被克隆。
和 ArrayList 不同,Vector 中的操作是线程安全的。
API
源码:
新增方法
add
有加synchronized
关键字,线程安全
代码实现:
public class ThreadDemo5 {
public static void main(String[] args) {
// Vector解决
List<String> list = new Vector<>();
for (int i = 0; i <30; i++) {
new Thread(()->{
// 向集合添加内容
list.add(UUID.randomUUID().toString().substring(0,8));
// 从集合获取内容
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
结果:
点击查看
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0, a709758a, 3bae2316, e044e3b0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0, a709758a, 3bae2316, e044e3b0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0, a709758a]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d, cd75f5d0]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714, bfc623e1, 456cc73d]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56, fa86e714]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370, df690160, 60f88e56]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc, 9bfde370]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935, f97f8cbe, b9a05dcc]
[a8fa2bca, be6ad566, 044f5c98, 00d1ef6e, cee50cfc, 3851dbb2, 90f06172, b5ef76de, 625743c7, 01406d89, fd74610c, 55db94c2, 42bede46, 4a7632b0, 0a2dcdb6, 4d265387, 9e5293f6, ce085935]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1.3 解决方案-Collections
注意
Collections 方式比较古老,从1.2版本就开始的。不推荐使用
API:
代码实现:
public class ThreadDemo5 {
public static void main(String[] args) {
// Collections解决
List<String> list = Collections.synchronizedList(new ArrayList<>());
for (int i = 0; i <30; i++) {
new Thread(()->{
// 向集合添加内容
list.add(UUID.randomUUID().toString().substring(0,8));
// 从集合获取内容
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
结果:
点击查看
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62, 1835359f, 1f4a0a7c, 96a4efc9, 96a8ac31]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62, 1835359f, 1f4a0a7c, 96a4efc9, 96a8ac31, c304d52c, abbcb796, 4368e574]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62, 1835359f, 1f4a0a7c, 96a4efc9, 96a8ac31, c304d52c, abbcb796]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62, 1835359f, 1f4a0a7c, 96a4efc9, 96a8ac31, c304d52c]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62, 1835359f, 1f4a0a7c, 96a4efc9]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62, 1835359f, 1f4a0a7c]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62, 1835359f]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731, 0f13d1da, 10ebfc62]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433, 24aa0731]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045, e5812433]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f, 42d0f045]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756, 97996f8f]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05, 3d560a03, b1e67756]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161, ebd3ba05]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30, 22178161]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610, f6e18d30]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141, 19600610]
[0e6312dd, 908eb6cb, 9813abfd, 4067c223, 857a2175, 7b99eab5, 53fa8495, 14380b3a, 421b7c35, b7581e39, 250af141]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1.4 解决方案-CopyOnWriteArrayList 😄
提示
CopyOnWriteArrayList: 写时赋值技术,从1.5开始。推荐使用
# CopyOnWriteArrayList 简介
API:
介绍:
读:读取的时候可以并发读
写:独立写, 每次写的时候先复制一块新的区域写入新内容,最终进行合并
当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器
。这时候会抛出来一个新的问题,也就是数据不一致的问题。如果写线程还没来得及写会内存,其他的线程就会读到了脏数据。这就是 CopyOnWriteArrayList 的思想和原理。就是拷贝一份
。
特点:
它最适合于具有以下特征的应用程序:List 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
它是线程安全的。
因为通常需要复制整个基础数组,所以可变操作(
add()
、set()
和remove()
等等)的开销很大。迭代器支持 hasNext(), next()等不可变操作,但不支持可变 remove()等操作。
使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。
好处: 即兼顾了并发读,也有了独立写的功能。
代码实现:
public class ThreadDemo5 {
public static void main(String[] args) {
// CopyOnWriteArrayList解决
List<String> list = new CopyOnWriteArrayList<>();
for (int i = 0; i <30; i++) {
new Thread(()->{
// 向集合添加内容
list.add(UUID.randomUUID().toString().substring(0,8));
// 从集合获取内容
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 源码
添加的时候线上锁,1、先复制出来一份;2.往里面添加数据; 3、把新的数组合并到原来的数据中心。
# 2. HashSet集合线程不安全
# 2.1 问题演示
API
新增方案中没有加锁,线程不安全。
代码实现
public class ThreadDemo5 {
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);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
结果:java.util.ConcurrentModificationException
点击查看
[2578e6e0, 9fabc3e7, 7a3153de, 794dbbd6, a82e77da, 4c183715, da0bbdd5, 18dccfad, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 72049fa6, 6d5067fc, 2672eee5, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 9fabc3e7, 7a3153de, 794dbbd6, a82e77da, 4c183715, da0bbdd5, 18dccfad, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 72049fa6, 6d5067fc, 2672eee5, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 9fabc3e7, 7a3153de, 794dbbd6, a82e77da, 4c183715, da0bbdd5, 18dccfad, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 72049fa6, 6d5067fc, 2672eee5, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 51f23be6]
[2578e6e0, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, 4c183715, da0bbdd5, 18dccfad, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 72049fa6, 6d5067fc, 2672eee5, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 9fabc3e7, 7a3153de, 794dbbd6, a82e77da, 4c183715, da0bbdd5, 18dccfad, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 72049fa6, 6d5067fc, 2672eee5, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 51f23be6]
[2578e6e0, 9fabc3e7, 7a3153de, 794dbbd6, a82e77da, 4c183715, da0bbdd5, 18dccfad, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 72049fa6, 6d5067fc, 2672eee5, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 51f23be6]
[2578e6e0, 9fabc3e7, 7a3153de, 794dbbd6, a82e77da, 4c183715, da0bbdd5, 18dccfad, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 72049fa6, 6d5067fc, 2672eee5, d4b70454, 9d7eeb82, 8910c211, b0f1542c, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, dd865380, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, d40f8956, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
[2578e6e0, 4c183715, 18dccfad, 04562688, 72049fa6, 6d5067fc, d4b70454, 9d7eeb82, 8910c211, b0f1542c, cba3f8c9, 9fabc3e7, 7a3153de, 794dbbd6, b207eac2, a82e77da, da0bbdd5, 44f42733, bfcfeeb5, 5f9d1988, 9cc5b30d, 0e33cb8e, a30415ec, 5418d995, 3547125f, 2672eee5, 51f23be6]
Exception in thread "5" Exception in thread "25" Exception in thread "2" Exception in thread "6" Exception in thread "26" Exception in thread "3" Exception in thread "23" Exception in thread "19" Exception in thread "21" 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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
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.io.PrintStream.println(PrintStream.java:821)
at com.tick.bill.ThreadDemo5.lambda$main$0(ThreadDemo5.java:19)
at java.lang.Thread.run(Thread.java:748)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 2.2 解决方案-CopyOnWriteArraySet 😄
API
代码实现:
public class ThreadDemo5 {
public static void main(String[] args) {
// 演示CopyOnWriteArraySet
Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 0; i <30; i++) {
new Thread(()->{
// 向集合添加内容
set.add(UUID.randomUUID().toString().substring(0,8));
// 从集合获取内容
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3. HashMap线程不安全
# 3.1 问题演示
代码实现
public class ThreadDemo5 {
public static void main(String[] args) {
// 演示HashMap
Map<String,String> map = new HashMap<>();
for (int i = 0; i <30; i++) {
String key = String.valueOf(i);
new Thread(()->{
//向集合添加内容
map.put(key,UUID.randomUUID().toString().substring(0,8));
//从集合获取内容
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
结果:java.util.ConcurrentModificationException
点击查看
{0=32039b61, 2=7ae4682b, 6=71869834, 3=a3e8865a}
{0=32039b61, 11=eee5823b, 12=238198db, 2=7ae4682b, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b}
{0=32039b61, 11=eee5823b, 2=7ae4682b, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b}
{0=32039b61, 11=eee5823b, 12=238198db, 2=7ae4682b, 13=cf0b4111, 14=59cb4b53, 15=3a9b6c04, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b, 10=91025b07, 7=2ed89e47}
{0=32039b61, 11=eee5823b, 12=238198db, 2=7ae4682b, 13=cf0b4111, 14=59cb4b53, 15=3a9b6c04, 16=c48f339e, 17=d84da3af, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b, 10=91025b07, 7=2ed89e47}
{11=eee5823b, 13=cf0b4111, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47}
{0=32039b61, 5=2aa8355b, 2=7ae4682b, 6=71869834, 3=a3e8865a, 8=7837958b, 9=3b20e214}
{11=eee5823b, 22=a74e342c, 13=cf0b4111, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 19=0b46a359, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{0=32039b61, 2=7ae4682b, 6=71869834, 3=a3e8865a, 9=3b20e214}
{0=32039b61, 2=7ae4682b, 6=71869834, 3=a3e8865a, 8=7837958b, 9=3b20e214}
{0=32039b61, 2=7ae4682b, 6=71869834, 3=a3e8865a}
{11=eee5823b, 22=a74e342c, 23=bf298f0d, 13=cf0b4111, 24=2d49dc00, 25=442b7fdd, 26=d81a9ce4, 27=7f3e1cc9, 29=fdf1095f, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 19=0b46a359, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{0=32039b61, 2=7ae4682b, 6=71869834, 3=a3e8865a}
{0=32039b61, 2=7ae4682b, 6=71869834, 3=a3e8865a}
{0=32039b61, 2=7ae4682b, 6=71869834, 3=a3e8865a}
{11=eee5823b, 22=a74e342c, 23=bf298f0d, 13=cf0b4111, 24=2d49dc00, 25=442b7fdd, 26=d81a9ce4, 27=7f3e1cc9, 28=ed3b17e6, 29=fdf1095f, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 19=0b46a359, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{11=eee5823b, 22=a74e342c, 23=bf298f0d, 13=cf0b4111, 25=442b7fdd, 26=d81a9ce4, 27=7f3e1cc9, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 19=0b46a359, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{11=eee5823b, 22=a74e342c, 23=bf298f0d, 13=cf0b4111, 26=d81a9ce4, 27=7f3e1cc9, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 19=0b46a359, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{11=eee5823b, 22=a74e342c, 23=bf298f0d, 13=cf0b4111, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 19=0b46a359, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{11=eee5823b, 22=a74e342c, 13=cf0b4111, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{11=eee5823b, 13=cf0b4111, 0=32039b61, 2=7ae4682b, 12=238198db, 3=a3e8865a, 4=eccfd4b3, 5=2aa8355b, 6=71869834, 18=c6f4eb7e, 8=7837958b, 9=3b20e214, 20=39de425e, 10=91025b07, 7=2ed89e47, 21=7312c9bb}
{0=32039b61, 11=eee5823b, 12=238198db, 2=7ae4682b, 13=cf0b4111, 14=59cb4b53, 15=3a9b6c04, 17=d84da3af, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b, 10=91025b07, 7=2ed89e47}
{0=32039b61, 11=eee5823b, 12=238198db, 2=7ae4682b, 13=cf0b4111, 14=59cb4b53, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b, 10=91025b07, 7=2ed89e47}
{0=32039b61, 11=eee5823b, 12=238198db, 2=7ae4682b, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b, 10=91025b07, 7=2ed89e47}
{0=32039b61, 11=eee5823b, 12=238198db, 2=7ae4682b, 4=eccfd4b3, 6=71869834, 8=7837958b, 9=3b20e214, 3=a3e8865a, 5=2aa8355b, 10=91025b07}
Exception in thread "14" Exception in thread "4" Exception in thread "20" Exception in thread "27" Exception in thread "24" 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.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:55)
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.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:55)
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.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:55)
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.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:55)
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.io.PrintStream.println(PrintStream.java:821)
at cn.cnlxc.lock.ThreadDemo5.lambda$main$0(ThreadDemo5.java:55)
at java.lang.Thread.run(Thread.java:748)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# 3.2 解决方案-ConcurrentHashMap
API
代码实现
public class ThreadDemo5 {
public static void main(String[] args) {
// 演示HashMap
Map<String,String> map = new ConcurrentHashMap<>();
for (int i = 0; i <30; i++) {
String key = String.valueOf(i);
new Thread(()->{
//向集合添加内容
map.put(key,UUID.randomUUID().toString().substring(0,8));
//从集合获取内容
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15