>

다른 스레드가X목록의 다른 색인을 수정하거나X다른 스레드가을 수정하도록하는 것이 좋은 디자인입니까? X공유 객체의 다른 속성.동기화/동기화 목록(모든 동시 데이터 구조) 사용을 고려했지만 그에 수반되는 성능 오버 헤드를 피하고 싶습니다. 이 접근법은X의 가치에 의존합니까?

이 에 따르면 단일 arraylist에 추가하는 스레드는 작동 할 수 있지만 좋은 디자인은 아닙니다. 이와 동일합니까?

답변이 언어마다 다를 경우, 특히 JAVA에 대해 질문하고 있지만, 왜 다른 언어가 다른지에 대한 이유를 알고 싶습니다.


  • 답변 # 1

    목록의 초기 크기가 고정 된 10 개의 요소라고 가정하고 요소 1에서 10을 처리하는 10 개의 스레드가 있다고 가정하면 공유 된 상호 상태가 없습니다 (공유 된 상호 상태는 모든 악의 근원입니다). 따라서 동기화에 큰 문제가 없으며 목록과 함께 진행됩니다.

    그러나 이것은 수행되는 작업과 목록의 크기에 따라 크게 달라집니다. 목록에 1000000 개의 요소가있는 경우 1000000 개의 스레드를 만드는 것은 비효율적이거나 불가능합니다.

    또한 목록에서 요소를 추가 및 삭제하기 시작하면 목록 자체가 공유 된 상호 상태가되므로 동기화에 대해 걱정해야합니다.

    편집 : 공유 상호 상태 정보

    상호가 아닌 상태를 공유하면 아무도 데이터를 변경할 수 없으므로 동기화에 문제가 없습니다.

    공유되지 않은 상호 상태 인 경우 상태를 변경할 수 있지만 현재 코드를 제외하고는 아무도 해당 상태에서 작동하지 않습니다. 따라서 변경 사항이 코드에 직접 반영됩니다.

    상호 공유 상태를 공유했다면, 이제 두 개의 스레드를 가질 수 있었는데 각 스레드는 다른 스레드의 데이터를 변경할 수있었습니다. 멀티 스레딩에서 순서 동기화 또는 잠금과 같은 메커니즘을 적용하지 않는 한 이러한 변경이 발생하고 판독기에 의해 반영되는 것은 결정적이지 않습니다. 따라서 다음과 같은 고전적인 문제가 발생할 수 있습니다.

    A는 요소 x에서 데이터를 읽고 변환합니다.

    B는 요소 x에서 데이터를 읽고 변환합니다.<-A는 아직 변경 사항을 쓰지 않았으므로 B는 오래된 데이터로 작동합니다

    A는 요소 x에 데이터를 씁니다

    B 쓰기 요소 x에 대한 데이터<-A의 변경 사항이 손실 됨

  • 이전 wpf의 ListView 분할 행 셀
  • 다음 c# - azure cosmos 문서 db - id별로 여러 문서 읽기