Java中fail-fast与fail-safe机制

fail-fast 快速失败

  • 一个线程在读取集合种的数据时,另外一个线程在修改集合会导致fail-fast
  • ArrayList  HashMap 具备此机制
  Map<Integer, String> map = new HashMap<Integer, String>();
        map.put(1,"Joshua");
        map.put(2,"sophia");
        map.put(3,"Linda");

        Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next().getValue());
       //修改 map.put(
5,"jjj"); } List<String> list = new ArrayList<String>(); list.add("kkk"); list.add("ddhh"); list.add("dddd"); list.add("hhh"); list.stream().forEach((l)->{ System.out.println(l);
       //修改 list.add(
"lll"); });

 

fail-safe  安全失败

采用安全失败机制的集合,在遍历时,先复制原来的集合,遍历的是复制的集合,在修改时,并不会被迭代器检测到,保证了安全性

  • 实现安全机制的集合:CopyOnWriteArrayList、CurrentHashMap
  • 不会输出添加或修改的内容
  • JUC下的包都是安全的可在多线程下使用
 CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
        list.add(4455);
        list.add(55);
        list.add(77);
        list.add(77);
        list.stream().forEach((s)->{
            System.out.println(s);
            list.add(144);
        });

/*
4455
55
77
77
*/

 

posted @ 2022-10-12 17:50  Joshua_BlueSky  阅读(21)  评论(0)    收藏  举报