Java에서 오류 방지 및 오류 방지 반복기는 무엇입니까?
Java에는 두 가지 유형의 반복기가 있습니다.
이것은 무엇을 의미하며 그 차이는 무엇입니까?
그들 사이의 차이점은 무엇입니까 ...
"안전 장치"는 실패하지 않음을 의미합니다. 엄밀히 말하면 Java에는 오류 방지 반복기 와 같은 것이 없습니다 . 올바른 용어는 "약한 일관성"입니다. javadoc은 다음과 같이 말합니다.
"대부분의 동시 Collection 구현 (대부분의 큐 포함)도 반복기 및 분할기가 빠른 실패 순회보다는 약한 일관성을 제공한다는 점에서 일반적인 java.util 규칙과 다릅니다."
일반적으로 약한 일관성은 컬렉션이 반복과 동시에 수정되는 경우 반복이 보는 것에 대한 보장이 약하다는 것을 의미합니다. (세부 사항은 각 동시 컬렉션 클래스 javadocs에 지정됩니다.)
"Fail fast" 는 실패 할 수 있음을 의미 하며, 손상이 발생 하기 전에 실패 상태가 감지되도록 (가능한 경우 1 ) 실패 상태를 적극적으로 확인 합니다. Java에서 Fail-Fast 반복자는 .ConcurrentModificationException
"fail-fast"및 "weakly consistency"에 대한 대안은 반복이 예기치 않게 실패하는 의미 론적입니다. 예를 들어 때때로 잘못된 대답을하거나 예상치 못한 예외를 던집니다. (이는 Enumeration
초기 버전의 Java에서 일부 표준 API 구현의 동작입니다 .)
... 그리고 우리가 수집에 사용하는 반복 기와는 다릅니다.
아니요 . 표준 컬렉션 유형에 의해 구현 된 반복기의 속성 입니다. 즉, 동기화 및 Java 메모리 모델과 관련하여 올바르게 사용되면 "빠르지 않음"또는 "약한 일관성"이 있습니다. 1 .
Fail-Fast 반복기는 일반적으로volatile
컬렉션 개체 의 카운터를 사용하여 구현됩니다 .
- 컬렉션이 업데이트되면 카운터가 증가합니다.
Iterator
가 생성 되면 카운터의 현재 값이Iterator
개체에 포함됩니다 .Iterator
작업이 수행 될 때 메서드는 두 카운터 값을 비교하고 다른 경우 CME를 발생시킵니다.
오류 방지 반복기의 구현은 일반적으로 가볍습니다. 일반적으로 특정 목록 구현의 데이터 구조 속성에 의존합니다. 일반적인 패턴은 없습니다. (관심있는 특정 컬렉션 클래스에 대한 소스 코드를 읽으십시오.)
1-라이더는 실패 빠른 동작이 동기화 및 메모리 모델과 관련하여 애플리케이션 ID가 올바르게 가정한다고 가정합니다. 이는 예를 들어 ArrayList
적절한 동기화없이 를 반복하는 경우 결과가 손상된 목록 결과가 될 수 있음을 의미합니다. "빠른 실패"메커니즘은 동시 수정을 감지 할 수 있지만 (보장되지는 않지만) 근본적인 손상은 감지하지 못합니다. 예를 들어 javadoc for Vector.iterator()
는 다음과 같이 말합니다.
"반복기의 빠른 실패 동작은 일반적으로 말해서 동기화되지 않은 동시 수정이있을 때 어떠한 엄격한 보장도 할 수 없기 때문에 보장 할 수 없습니다. 실패 빠른 반복자
ConcurrentModificationException
는 최선의 노력을 다합니다. 정확성을 위해이 예외에 의존하는 프로그램을 작성하는 것은 잘못된 것입니다. 반복자의 fail-fast 동작은 버그를 감지하는 데만 사용해야합니다. "
그들은 오히려된다 르파 와 약한 일관성 유형 :
반복하는 동안 컬렉션의 메서드 (추가 / 제거)에 의해 컬렉션이 수정 된 경우 java.util
패키지의 반복자가 throw ConcurrentModificationException
됩니다.
java.util.concurrent
패키지의 반복자는 일반적으로 스냅 샷을 반복하고 동시 수정을 허용하지만 반복기가 생성 된 후 컬렉션 업데이트를 반영하지 않을 수 있습니다.
유일한 차이점은 fail-safe iterator는 fail-fast Iterator와 달리 예외를 발생시키지 않는다는 것입니다.
한 스레드가 반복하는 동안 Collection이 구조적으로 수정 된 경우. 이것은 원래 컬렉션 대신 Collection의 복제 작업을 수행하기 때문에 오류 방지 반복기로 호출됩니다.
CopyOnWriteArrayList의 Iterator는 Fail-Safe Iterator의 예입니다.
참고 URL : https://stackoverflow.com/questions/17377407/what-are-fail-safe-fail-fast-iterators-in-java
'program tip' 카테고리의 다른 글
다른 프로그래밍 언어로 쉽게 번역 할 수 있도록 코드에 어떤 종류의 패턴을 적용 할 수 있습니까? (0) | 2020.08.27 |
---|---|
PHP 5.4에서 엄격한 표준 비활성화 (0) | 2020.08.27 |
JavaScript에서 이것과 self의 차이점 (0) | 2020.08.27 |
각 행의 최대 값을 가진 열 이름을 찾습니다. (0) | 2020.08.27 |
PHP에서 배열 키로 사용되는 숫자 문자열 (0) | 2020.08.27 |