Java에서의 Fail-safe 및 Fail-Fast Iterator란 무엇입니까?
Java에는 Fail-safe와 Fail-Fast의 두 가지 유형의 반복기가 있습니다.
이것은 무엇을 의미하며, 그 차이는 무엇입니까?
그 둘의 차이점은 무엇입니까?
Fail-safe(페일 세이프)는 엔지니어링에서 손상을 일으키지 않거나 최소화하는 방법으로 고장이 발생하는 것을 의미합니다.엄밀히 말하면 Java에는 Fail-safe reterator라는 것이 없습니다.반복기에 장애가 발생하면(일반적인 "장애"의 의미), 손상이 발생할 수 있습니다.
사실 '약하게 일관된' 반복자를 말하는 것 같군요javadoc은 다음과 같이 말합니다.
대부분의 동시 컬렉션 구현(대부분의 큐 포함)은 고속 실패 트래버설이 아니라 반복기와 스플리터가 약하게 일관성을 제공한다는 점에서 일반적인 java.util 규약과도 다릅니다.
일반적으로 일관성이 약하다는 것은 컬렉션이 반복과 동시에 변경되는 경우 반복에 표시되는 내용의 보장이 약하다는 것을 의미합니다(상세한 내용은 각 동시 컬렉션 클래스 javadoc에서 지정됩니다).
Fail-Fast(시스템 설계에서 Fail-Fast)는 과도한 손상이 발생하기 전에 (가능한 경우1) 고장 조건이 감지되도록 적극적으로 점검하는 것을 의미합니다.Java에서는 Fail-Fast Iterator가 실패하면ConcurrentModificationException
.
「fail-fast」 「fail-fast」 「fail consistent」 「fail consistent」라고 합니다. (이 (의 표준 )의 이었습니다.Enumeration
Java API).
수집에 사용하는 반복기와는 다른가요?
아니요. 이들은 표준 컬렉션 유형에 의해 구현된 반복기의 속성입니다. 즉, 동기화 및 Java 메모리1 모델에 대해 올바르게 사용되는 경우 "fail fast" 또는 "weakly consistency"입니다.
Fail-Fast Iterator는 일반적으로volatile
소장품
- 수집이 갱신되면 카운터가 증가합니다.
- 「 」의
Iterator
이 "에됩니다.Iterator
★★★★★★ 。 - 「 」의
Iterator
이 메서드는 2개의 카운터 값을 비교하여 다른 경우 CME를 슬로우합니다.
반면, 약하게 일관된 반복기는 일반적으로 가볍고 각 동시 컬렉션의 내부 데이터 구조의 속성을 활용합니다.일반적인 패턴은 없습니다.관심이 있는 경우 다른 컬렉션 클래스의 소스 코드를 읽어 보십시오.
1 - Fail-Fast Iterator 동작은 애플리케이션이 동기화 및 메모리 모델에 대해 올바르게 구현되어 있다고 가정합니다.(즉, 어플리케이션은 스레드 세이프입니다).예를 들어, 이 명령어를 반복한 경우ArrayList
적절한 동기화가 없으면 "fast fail" 메커니즘은 동시 수정을 검출해야 합니다(단, 보장되지 않음). 그러나 애플리케이션의 안전하지 않은 동작으로 인해 목록이 파손되는 것을 막을 수는 없습니다.예를 들어, javadoc은Vector.iterator()
다음과 같이 말합니다.
「반복기의 fail-fast 동작은, 일반적으로, 동기화가 되어 있지 않은 동시 변경에서는 하드 보증이 불가능하기 때문에, 보증할 수 없습니다.는 Fail-Fast를 슬로우한다.
ConcurrentModificationException
최선의 방법으로요.따라서 이 예외에 따라 올바른 프로그램을 작성하는 것은 잘못된 것입니다.반복자의 Fail-Fast 동작은 버그를 검출하기 위해서만 사용해야 합니다.
이들은 다소 fail-fast로 일관성이 약한 유형입니다.
음 java.util
던지기ConcurrentModificationException
하는 동안 수집삭제)에된 경우(추가/삭제)
음 java.util.concurrent
일반적으로 패키지는 스냅샷을 반복하고 동시에 수정할 수 있지만 반복기 생성 후 수집 업데이트를 반영하지 않을 수 있습니다.
유일한 차이점은 Fail-Safe Iterator는 Fail-Fast Iterator와 달리 예외를 발생시키지 않는다는 것입니다.
하나의 스레드가 반복되는 동안 컬렉션이 구조적으로 수정된 경우.이는 원래 컬렉션이 아닌 Collection의 클론에서 작동하기 때문에 Fail Safe Reterator라고 불립니다.
CopyOnWriteArrayList의 반복기는 Fail-safe Iterator의 한 예이며 ConcurrentHashMap keySet에 의해 작성된 반복기도 Fail-safe 반복기이며 ConcurrentModification을 실행하지 않습니다.Java 예외입니다.
이 시나리오는 "동시 처리"와 관련되어 있습니다.즉, 여러 사용자가 같은 리소스에 액세스하고 있는 것을 의미합니다.이러한 상황에서 사용자 중 한 명이 해당 리소스를 수정하려고 시도하면 'Concurrent Processing Exception'이 발생합니다. 이 경우 다른 사용자가 부적절한 데이터를 받게 됩니다.이 두 가지 유형 모두 이러한 상황과 관련이 있습니다.
간단히 말하면
Fail-Fast:
- 반복자가 즉시 Concurrent Modification을 슬로우합니다.구조 수정(추가, 업데이트, 삭제)이 발생한 경우 예외입니다.
- 예: ArrayList, HashMap, TreeSet
페일 세이프:
- 여기서 반복자는 원본이 아닌 컬렉션의 복제본에서 작동하기 때문에 예외를 발생시키지 않습니다.즉, Fail-safe를 반복하는 것입니다.
- 예: CopyOnWriteArrayList, ConcurrentHashMap
언급URL : https://stackoverflow.com/questions/17377407/what-are-fail-safe-fail-fast-iterators-in-java
'programing' 카테고리의 다른 글
POST 본문을 php로 가져오려면 어떻게 해야 하나요? (0) | 2022.10.02 |
---|---|
조건과 일치하는 배열 내 개체의 인덱스를 가져옵니다. (0) | 2022.10.02 |
VueJ의 상태 저장 구성 요소 루트 요소에서 v-for를 사용할 수 없음s (0) | 2022.09.30 |
MacOS와 Linux에서 기능 동작의 차이를 암호화하시겠습니까? (0) | 2022.09.30 |
숫자 문자열을 숫자 배열로 변환하려면 어떻게 해야 합니까? (0) | 2022.09.30 |