1. 程式人生 > 其它 >JUC程式設計(一)-集合安全性問題

JUC程式設計(一)-集合安全性問題

四.集合安全性問題

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();
            }
        }
    }