并发
- java.util.concurrent. 并发—->充分利用CPU的资源
- java.util.concurrent.atomic 原子性
- java.util.concurrent.locks 锁
对于锁,可以去看一下<Java中级-多线程一二三>,以后在整理好,抱歉
现在主要讲的是并发下,集合 List, Set , Map的安全问题
对于List集合
先看一个List<String> list = new ArrayList<String>();
1 | public static void listSate() { |
结果:
[67a]
[67a, 501]
[67a, 501, a85]
[67a, 501, a85, 934]
[67a, 501, a85, 934, e9d]
[67a, 501, a85, 934, e9d, e6c]
[67a, 501, a85, 934, e9d, e6c, 402]
[67a, 501, a85, 934, e9d, e6c, 402, 016]
[67a, 501, a85, 934, e9d, e6c, 402, 016, 24b]
[67a, 501, a85, 934, e9d, e6c, 402, 016, 24b, be6]单线程正常添加10个数据:10
15多线程添加数据:
[8a0, bfe]
14多线程添加数据:
[8a0, bfe]
16多线程添加数据:
[8a0, bfe, 556]
17多线程添加数据:
[8a0, bfe, 556, 8f9, ef1]
Exception in thread “线程4” Exception in thread “线程7” Exception in thread “线程8” 19多线程添加数据:
[8a0, bfe, 556, 8f9, ef1, ac1]
23多线程添加数据:
[8a0, bfe, 556, 8f9, ef1, ac1, e8d, 512, 348]
20多线程添加数据:
[8a0, bfe, 556, 8f9, ef1, ac1, e8d, 512, 348, 444]
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
最后发现,在多线程操作的时候,报了ConcurrentModificationException异常 ( 翻译过来就是 并发修改异常 )
解决办法:
三种:
1 | List<String> listThread =Collections.synchronizedList(new ArrayList<String>()); // 安全 |
第一种: 采用集合工具类提供的安全方法Collections.synchronizedList()
第二种是使用List 的子类 Vector 是支持同步的
第三种是使用CopyOnWriteArrayList类
结果就是 :不报异常
对于Set集合
先看一个:
1 | public static void SetSafe() { |
结果:
同样是抛出异常
ConcurrentModificationException
解决办法:
两种:
1 | Set<String> setTread = Collections.synchronizedSet(new HashSet<String>()); // 安全 |
第一种: 采用Collections集合工具类提供的Collections.synchronizedSet()方法
第二章:采用CopyOnWriteArraySet类
结果就是不报异常
对于Map集合
先看一个
1 | public static void mapSafe() { |
结果:
报异常
解决办法两个
1 | Map<String, String> mapTread = new Hashtable<String, String>(); // 安全 |
第一种:采用Map的子类HashTable
第二种:采用集合工具类Collections.synchronizedMap()
第三种:采用 ConcurrentHashMap 类
小唠嗑:
本章到这里就结束了,谢谢耐心看到这里的各位Boss,如果觉得有哪里说的不好的地方,还请高抬贵手多多原谅,不惜指教。
最后,谢谢!