JUC程式設計(一)-集合安全性問題
阿新 • • 發佈:2021-10-09
四.集合安全性問題
ArrayList安全性問題
問題:在併發情況下,ArrayList可能會導致add的內容為空,丟擲java.util.ConcurrentModificationException(併發修改異常)。
解決方案:
- List list = new Vector();(Vector的add方法添加了synchronized鎖,該方法會影響效能)
點選檢視程式碼
public class ListS { public static void main(String[] args) { List list = new Vector(); for (int i = 0; i < 100; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,3)); System.out.println(list); }).start(); } } }
- List list = Collections.synchronizedList(new ArrayList());
點選檢視程式碼
public class ListS { public static void main(String[] args) { List list = Collections.synchronizedList(new ArrayList()); for (int i = 0; i < 100; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,3)); System.out.println(list); }).start(); } } }
- List list = new CopyOnWriteArrayList();
點選檢視程式碼
public class ListS { public static void main(String[] args) { List list = new CopyOnWriteArrayList(); for (int i = 0; i < 100; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,3)); System.out.println(list); }).start(); } } }
Set安全性問題
解決方案:
- Set set = new CopyOnWriteArraySet();
點選檢視程式碼
public class SetS { public static void main(String[] args) { Set set = new CopyOnWriteArraySet(); for (int i = 0; i < 150; i++) { new Thread(()->{ set.add(UUID.randomUUID().toString().substring(0,3)); System.out.println(set); }).start(); } } }
- Set set = Collections.synchronizedSet(new HashSet());
Map安全性問題
解決方案:
- Map<String,String> map = Collections.synchronizedMap(new HashMap<>());
點選檢視程式碼
public class MapS { public static void main(String[] args) { Map<String,String> map = Collections.synchronizedMap(new HashMap<>()); for (int i = 0; i < 100; i++) { new Thread(()->{ map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,3)); System.out.println(map); }).start(); } } }
- Map<String,String> map = new ConcurrentHashMap<>();
點選檢視程式碼
public class MapS { public static void main(String[] args) { Map<String,String> map = new ConcurrentHashMap<>(); for (int i = 0; i < 100; i++) { new Thread(()->{ map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,3)); System.out.println(map); }).start(); } } }