홈>
다른 스레드가X목록의 다른 색인을 수정하거나X다른 스레드가을 수정하도록하는 것이 좋은 디자인입니까? X공유 객체의 다른 속성.동기화/동기화 목록(모든 동시 데이터 구조) 사용을 고려했지만 그에 수반되는 성능 오버 헤드를 피하고 싶습니다. 이 접근법은X의 가치에 의존합니까?
이 에 따르면 단일 arraylist에 추가하는 스레드는 작동 할 수 있지만 좋은 디자인은 아닙니다. 이와 동일합니까?
답변이 언어마다 다를 경우, 특히 JAVA에 대해 질문하고 있지만, 왜 다른 언어가 다른지에 대한 이유를 알고 싶습니다.
- 답변 # 1
관련 자료
- java - 다른 스레드에 대해 반환 된 ThreadLocal 동일한 인스턴스
- Java 용 Project Loom의 가상 스레드 (섬유)와`Threadsleep`이 다릅니다
- Rust의 다른 스레드에서 파일에 어떻게 쓰나요?
- multithreading - 다중 스레드로 공유 메모리에 쓰기, 뮤텍스 없음
- c - 두 스레드에서 안전하게 변수 수정
- delphi - Indy TCP 소켓을 두 스레드간에 공유 할 수 있습니까?
- c++ - 여러 스레드의 공유 잠금은 단독 잠금을 찾는 단일 스레드를 고갈시킬 수 있습니다
- multithreading - 시스템이 캐시 일관성을 유지하는 경우 서로 다른 프로세서에 고정 된 두 스레드간에 읽기/쓰기를 조각 낼 수 있습니까?
- C, Linux에서 다른 프로세스의 스레드 동기화
- c - 세마포어를 사용하여 다른 프로세스에서 스레드 동기화
- Java - 자바 - 스레드를 시작하는 다른 방법이 있습니까?
- c# - 다른 읽기 스레드에서 쓰기 확인
목록의 초기 크기가 고정 된 10 개의 요소라고 가정하고 요소 1에서 10을 처리하는 10 개의 스레드가 있다고 가정하면 공유 된 상호 상태가 없습니다 (공유 된 상호 상태는 모든 악의 근원입니다). 따라서 동기화에 큰 문제가 없으며 목록과 함께 진행됩니다.
그러나 이것은 수행되는 작업과 목록의 크기에 따라 크게 달라집니다. 목록에 1000000 개의 요소가있는 경우 1000000 개의 스레드를 만드는 것은 비효율적이거나 불가능합니다.또한 목록에서 요소를 추가 및 삭제하기 시작하면 목록 자체가 공유 된 상호 상태가되므로 동기화에 대해 걱정해야합니다.
편집 : 공유 상호 상태 정보
상호가 아닌 상태를 공유하면 아무도 데이터를 변경할 수 없으므로 동기화에 문제가 없습니다.
공유되지 않은 상호 상태 인 경우 상태를 변경할 수 있지만 현재 코드를 제외하고는 아무도 해당 상태에서 작동하지 않습니다. 따라서 변경 사항이 코드에 직접 반영됩니다.
상호 공유 상태를 공유했다면, 이제 두 개의 스레드를 가질 수 있었는데 각 스레드는 다른 스레드의 데이터를 변경할 수있었습니다. 멀티 스레딩에서 순서 동기화 또는 잠금과 같은 메커니즘을 적용하지 않는 한 이러한 변경이 발생하고 판독기에 의해 반영되는 것은 결정적이지 않습니다. 따라서 다음과 같은 고전적인 문제가 발생할 수 있습니다.
A는 요소 x에서 데이터를 읽고 변환합니다.
B는 요소 x에서 데이터를 읽고 변환합니다.<-A는 아직 변경 사항을 쓰지 않았으므로 B는 오래된 데이터로 작동합니다
A는 요소 x에 데이터를 씁니다
B 쓰기 요소 x에 대한 데이터<-A의 변경 사항이 손실 됨