Java에서 최적의 동시 실행 목록 선택
내 스레드 풀에는 스레드 수가 고정되어 있습니다.이러한 스레드는 공유 목록에서 자주 쓰고 읽어야 합니다.
즉, 어떤 데이터 구조(리스트가 되는 것이 좋으며, 모니터가 필요합니까?java.util.concurrent
이 경우 패키지가 가장 좋습니까?
하는 것이 좋다
List
유일한 List
에서의 실장java.util.concurrent
Copy On Write Array List 입니다.트래비스 웹이 말한 것처럼 동기화된 리스트의 옵션도 있습니다.
단, 정말 필요한 것이 있습니까?List
? 동시 실행에는 더 많은 옵션이 있습니다.Queue
및Map
s(또,Set
에서Map
s) 그리고 이러한 구조는 공유 데이터 구조에서 수행하고자 하는 많은 유형의 작업에 가장 적합한 경향이 있습니다.
큐에는 다양한 옵션이 있으며 어떤 옵션이 가장 적합한지는 사용 방법에 따라 달라집니다.
- Concurrent Linked Queue(동시 링크 큐)
- 어레이 블로킹 큐
- Linked Blocking Deque(링크드 블로킹 디큐)
- Linked Blocking Queue(Linked Blocking 큐)
- priority blocking 큐
- 동기 큐
- 지연 큐
Java 컬렉션은 다음과 같이 스레드 세이프 상태로 만들 수 있습니다.
List newList = Collections.synchronizedList(oldList);
또는 완전히 새로운 스레드 세이프 목록을 작성하려면:
List newList = Collections.synchronizedList(new ArrayList());
ConcurrentLinkedQueue
는 (새로운 CAS 명령에 따라) 잠금프리 큐를 사용합니다.
목록의 크기가 고정된 경우 AtomicReferenceArray를 사용할 수 있습니다.그러면 슬롯에 인덱스된 업데이트를 수행할 수 있습니다.필요한 경우 목록 보기를 작성할 수 있습니다.
Paul Martin의 "A Practical Lock-Free Doubly Linked List"를 바탕으로 Doug Lea가 작성한 Concurrent Doubly Linked List를 참조해 주십시오.java.util은 구현되지 않습니다.인터페이스를 나열하지만 목록에서 사용하는 대부분의 메서드를 제공합니다.
javadoc에 따르면:
Deque(더블 엔드 큐)의 동시 링크 리스트 실장.동시 삽입, 제거 및 액세스 작업은 여러 스레드에 걸쳐 안전하게 실행됩니다.반복기는 약하게 일관되며 반복기 생성 시점 또는 이후 어느 시점에서 디큐 상태를 반영하는 요소를 반환합니다.Concurrent Modification은 슬로우하지 않습니다.예외이며 다른 작업과 동시에 진행할 수 있습니다.
설정이 충분한 경우 ConcurrentSkipListSet을 사용할 수 있습니다.(이 실장은 건너뛰기 목록을 구현하는 ConcurrentSkipListMap을 기반으로 합니다).
포함, 추가 및 제거 작업의 예상 평균 시간 비용은 log(n)입니다. 크기 지정 방식은 고정 시간 작업이 아닙니다.
언급URL : https://stackoverflow.com/questions/8203864/choosing-the-best-concurrency-list-in-java
'programing' 카테고리의 다른 글
액세스 제어 요청 헤더, jQuery를 사용하여 AJAX 요청 헤더에 추가됩니다. (0) | 2022.10.10 |
---|---|
MySQL에서 null을 0으로 바꿉니다. (0) | 2022.10.10 |
배열에 특정 값이 php에 포함되어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2022.10.10 |
생성자 표현식 vs. 목록 통합 (0) | 2022.10.10 |
python을 사용하여 어레이 셔플, python을 사용하여 어레이 항목 순서 랜덤화 (0) | 2022.10.10 |