java에서modCount 상세 및 원본 분석

2681 단어 javamodCount
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로 성명되어 라인 간 수정의 가시성을 확보합니다.
그래서 여기서 여러분에게 비선정적이고 안전한 데이터 구조를 두루 훑어볼 때 가능한 한 교체기를 사용하라고 건의합니다
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기