java에서modCount 상세 및 원본 분석
Array List, Linked List, Hash Map 등 내부에서 증가, 삭제, 수정 과정에서 우리는 항상 modCount의 모습을 볼 수 있다. modCount는 글자 그대로 수정 횟수를 의미하지만 왜 modCount의 수정 횟수를 기록해야 합니까?
모두들 공통적인 특징이 없다는 것을 발견했다. 모든modCount 속성을 사용하는 것은 모두 라인이 안전하지 않다는 것이다. 이것은 왜일까?이 물건은 틀림없이 라인 안전과 관계가 있다는 것을 설명하는데, 그게 무슨 상관이냐
원본 코드를 읽으면 이 항목은 이 데이터 구조에 대응하는 교체기에서만 사용할 수 있음을 알 수 있습니다. HashMap을 예로 들면:
private abstract class HashIterator<E> implements Iterator<E> {
Entry<K,V> next; // next entry to return
int expectedModCount; // For fast-fail
int index; // current slot
Entry<K,V> current; // current entry
HashIterator() {
expectedModCount = modCount;
if (size > 0) { // advance to first entry
Entry[] t = table;
while (index < t.length && (next = t[index++]) == null)
;
}
}
public final boolean hasNext() {
return next != null;
}
final Entry<K,V> nextEntry() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
Entry<K,V> e = next;
if (e == null)
throw new NoSuchElementException();
if ((next = e.next) == null) {
Entry[] t = table;
while (index < t.length && (next = t[index++]) == null)
;
}
current = e;
return e;
}
public void remove() {
if (current == null)
throw new IllegalStateException();
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
Object k = current.key;
current = null;
HashMap.this.removeEntryForKey(k);
expectedModCount = modCount;
}
}
상기 코드에서 알 수 있듯이 하나의 교체기가 초기에 이 교체기의 대상을 호출하는 mCount를 부여합니다. 어떻게 교체기가 돌아다니는 과정에서 이 대상의 mcount와 교체기에 저장된 mcount가 다르다는 것을 발견하면 이상을 던집니다.네, 다음은 이것의 완전한 설명입니다.
Fail-Fast 메커니즘
우리는 자바를 안다.util.HashMap은 스레드가 안전하지 않기 때문에 교체기를 사용하는 과정에서 다른 스레드가 맵을 수정하면 ConcurrentModification Exception을 던진다. 이것이 바로fail-fast 전략이다.이 전략은 원본 코드에서modCount 영역을 통해 이루어진다. modCount는 말 그대로 수정 횟수이다. HashMap 내용에 대한 수정은 이 값을 증가시킨다. 그러면 교체기 초기화 과정에서 이 값을 교체기의 expectedModCount에 부여한다.교체 과정에서modCount와expectedModCount가 같은지 판단하고 같지 않으면 다른 라인이 맵을 수정했음을 나타냅니다:modCount가volatile로 성명되어 라인 간 수정의 가시성을 확보합니다.
그래서 여기서 여러분에게 비선정적이고 안전한 데이터 구조를 두루 훑어볼 때 가능한 한 교체기를 사용하라고 건의합니다
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.