关于集合的安全问题
1.ArrayList的解决方案:
1. Vector
2. Collections.synchronizedList()
3. CopyOnWriteArrayList
2.hashSet的解决方案
1.CopyOnWriteArraySet
3.hashMap的解决方案
1. ConcurrentHashMap
list:
当多个线程对list集合进行一个add和查看时就会发生java.util.ConcurrentModificationException
代码:
List<Object> list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add("x");
}).start();
}
System.out.println(list);
而Vector解决方案为:
List<Object> list = new Vector<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add("x");
}).start();
}
System.out.println(list);
Collections.synchronizedList()的解决方案
List<Object> objects=new ArrayList<>();
List<Object> list = Collections.synchronizedList(objects);
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add("x");
}).start();
}
但前两种已经过时了,现在使用
CopyOnWriteArrayList list = new CopyOnWriteArrayList();
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add("x");
}).start();
}
System.out.println(list);
这个的原理为,当读的读写异步,在读的时候将旧的数据复制一份,用旧的数据进行读,用心的数据进行写
hashSet的解决方案:
CopyOnWriteArraySet()的原理本质上和CopyOnWriteArrayList()一样
Set set = new CopyOnWriteArraySet();
for (int i = 0; i < 30; i++) {
new Thread(()->{
set.add("x");
}).start();
}
System.out.println(set);
hashMap的线程不安全问题的解决
Map<Object, Object> hashMap = new ConcurrentHashMap<>();
for (int i = 0; i < 30; i++) {
String s = String.valueOf(i);
new Thread(() -> {
hashMap.put(s,UUID.randomUUID().toString().substring(0,8));
System.out.println(hashMap);
}).start();
}
具体解决为在putval方法中加入了synchronized代码块
而hashmap中并没有