English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java에서 故障 빠르게와 故障 안전성之间的 차이

순번불합격故障安全
1
예외
셋 내의 어떤 변경도(예를 들어, 스레드 동안 셋에 추가, 제거 및 업데이트)는 이터레이션된 셋을 변경한 후, 빠르게 동기화된 변경을 실패로 만드는 이터레이션을 수행합니다. 
故障安全 셋은 예외를 발생시키지 않습니다. 
2。
셋 타입
ArrayList와 hashmap 셋은 빠른 실패 이터레이터의 예입니다 
CopyOnWrite와 동기화된 수정은 故障安全 이터레이터의 예입니다 
3。
성능과 기억
이터레이터는 실제 셋에서 작업합니다. 따라서 이터레이터는 추가적인 메모리와 시간이 필요하지 않습니다. 
그는 실제 셋이 아니라 셋의克隆을 처리하고 있습니다. 시간과 메모리 비용
4。
수정 항목
 이터레이터는 셋을 이터레이션하는 동안 셋을 수정하지 않도록 합니다.
구조 보호 이터레이터는 셋을 이터레이션하는 동안对其进行 수정할 수 있습니다.

구조 보호 예제

public class FailSafeExample{
   public static void main(String[] args){
      ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
      //맵에 요소 추가
      map.put("Dell", 1);
      map.put("IBM", 2);
      //맵에서 이터레이터 가져오기
      Iterator<String> it = map.keySet().iterator();
      while (it.hasNext()){
      String key = (String) it.next();
         System.out.println(key+" : "+map.get(key));
         map.put("Google", 3);
      }
   }
}

출력 결과

IBM :2
Dell:1

구조 보호 예제

public class FailFastExample{
   public static void main(String[] args){
      List<Integer> list = new ArrayList<Integer>();
      list.add(1);
      list.add(2);
      list.add(3);
      //리스트에서 이터레이터 가져오기
      Iterator<Integer> it = list.iterator();
      while (it.hasNext()){
         Integer integer = (Integer) it.next();
         list.add(4);
      }
   }
}

출력 결과

Exception in thread "main" java.util.ConcurrentModificationException
   at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
추천 합니다