Fail-Fast 방식은 동작중 오류가 발생하면 바로 오류를 알리고 작업을 중단합니다.
Fail-Safe 방식은 동작중 오류가 발생해도 작업을 중단하지 않고 진행합니다.
java에서는 Iterator가 for문을 이용한 순환중 데이터가 변경되었을 때
Fail-Fast 방식이면 java.util.ConcurrentModificationException 오류를 throw 하고
Fail-Safe 방식이면 동작이 계속된다.
Fail-Safe 방식은 ConcurrentHashMap을 이용할 때만 가능하다.
ex)
package com.test.dbtest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
public class test {
public static void funcFailFast() {
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
numbers.add(50);
System.out.println(number);
}
}
public static void funcFailSafe() {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("First", 10);
map.put("Second", 20);
map.put("Third", 30);
map.put("Fourth", 40);
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
map.put(key, 50);
System.out.println("key: " + key);
}
}
public static void main(String[] args) {
funcFailFast();
funcFailSafe();
}
}