"수집 수정 : 열거 작업이 실패 할 수있다"오류
오류 "수집이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다"는 반복되는 동안 컬렉션이 변경 될 때 발생하여 예측할 수없는 행동으로 이어집니다. 이것은 일반적으로 다중 스레드가 동일한 컬렉션에 동시에 액세스하고 수정하는 다중 스레드 시나리오에서 발생합니다.
이 특정 오차는 사전이 루프 내에서 액세스되는 메소드에서 나타납니다. 이 사전에 대한 동시 수정 (예 : 클라이언트 구독 또는 구독 취소)이 열거를 무효화합니다.
솔루션 : 스레드 안전 구현
이를 해결하기 위해 사전에 대한 스레드 안전이 중요합니다. 두 가지 접근법이 권장됩니다 :
NotifySubscribers()
subscribers
사용 foreach
:
표준 사전을 로 바꾸십시오. 이 데이터 구조는 본질적으로 스레드 안전이므로 오류를 방지합니다
반복을위한 사본 만들기 :
루프 전에 를 사용하여 사전 값의 사본을 만듭니다. 이것은 원래 사전에 대한 후속 수정으로 영향을받지 않는 스냅 샷을 만듭니다.
subscribers
코드 예제 :
: 를 사용하도록 수정 된 - 메소드는 다음과 같습니다
그리고 여기에 안전한 사본을 만들기 위해 를 사용하는 버전은 다음과 같습니다.
이러한 솔루션 중 하나를 구현함으로써 스레드 안전을 보장하고 "컬렉션이 수정되었습니다 ..."오류를 방지하여보다 강력하고 안정적인 코드로 이어집니다. ConcurrentDictionary
.
위 내용은 다중 스레드 환경에서 '수집 수정; 열거 작업이 실행되지 않을 수 있습니다'오류를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!