目录
一.集合不安全(ConcurrentModificationException)
2.Collections.synchronizedList()方法
3.new CopyOnWriteArrayList<>();写入时复制;
4.Vector<>()与CopyOnWriteArrayList<>()对比:为什么不去用vector而去用CopyOnWriteArrayList?
1.Collections.synchronizedSet()
2.Collections.synchronizedMap()方法
一.集合不安全(ConcurrentModificationException)
1.并发下,ArrayList不安全
import java.util.*;
public class ListTest {
public static void main(String[] args) {
//并发下,ArrayList不安全
List<String> list=new ArrayList<>();
for (int i = 0; i <20 ; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
2.List解决方法:
1.Vector(一般傻子都会想到,这个方法不太行)
import java.util.*;
public class ListTest {
public static void main(String[] args) {
//并发下,ArrayList不安全
//List<String> list=new ArrayList<>();
//1.vector默认是安全的
List<String> list=new Vector<>();
for (int i = 0; i <20 ; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
2.Collections.synchronizedList()方法
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class ListTest {
public static void main(String[] args) {
//2.Collections.synchronizedList()方法
List<String> list=Collections.synchronizedList(new ArrayList<>());
for (int i = 0; i <20 ; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
3.new CopyOnWriteArrayList<>();写入时复制;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class ListTest {
public static void main(String[] args) {
//3.new CopyOnWriteArrayList<>();写入时复制;
List<String> list=new CopyOnWriteArrayList<>();
for (int i = 0; i <20 ; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
4.Vector<>()与CopyOnWriteArrayList<>()对比:为什么不去用vector而去用CopyOnWriteArrayList?
Vector底层用的是synchronized,CopyOnWrite底层用的是lock锁。
3.Set不安全
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class SetTest {
public static void main(String[] args) {
Set<String> set=new HashSet<>();
for (int i = 0; i <20 ; i++) {
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
4.Set解决方法
1.Collections.synchronizedSet()
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class SetTest {
public static void main(String[] args) {
Set<String> set=Collections.synchronizedSet(new HashSet<String>());
for (int i = 0; i <20 ; i++) {
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
2.new CopyOnWriteArraySet<>()
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;
public class SetTest {
public static void main(String[] args) {
Set<String> set=new CopyOnWriteArraySet<>();
for (int i = 0; i <20 ; i++) {
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
5.Hashset底层是什么?
底层是HashMap,
public HashSet() {
map = new HashMap<>();
}
add方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
6.HashMap不安全
面试必问:加载因子默认:0.75,初始化容量默认:16
工作中不用
Map<String,String> map=new HashMap<>();
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class MapTest {
public static void main(String[] args) {
//Map<String,String> map=new HashMap<>();
Map<String,String> map=new HashMap<>();
for (int i = 0; i <20 ; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
2.Collections.synchronizedMap()方法
public class MapTest {
public static void main(String[] args) {
Map<String,String> map= Collections.synchronizedMap(new HashMap<>());
for (int i = 0; i <20 ; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
3.new ConcurrentHashMap<>()
public class MapTest {
public static void main(String[] args) {
Map<String,String> map=new ConcurrentHashMap<>();
for (int i = 0; i <20 ; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}