문제

Java API를 모르는 .NET 전문가를 요약하기 위해 :

동의어 Java에는 다음과 같은 일반적인 맵 수정 작업을위한 원자 방법 (즉, 외부 잠금이 필요하지 않음)이 있습니다.

putIfAbsent(K key, V value)
remove(Object key, Object value)
replace(K key, V value)

또한 잠금없이 키 세트를 반복 할 수 있습니다 (반복 시작시 사본이 필요합니다). get() 운영은 일반적으로 전화와 대화 할 수 있습니다 put() 차단하지 않고 (미세한 그레이드 잠금 스트립을 사용합니다 IIRC).

어쨌든 내 질문은 다음과 같습니다. .NET은 동등한 사전 구현을 가지고 있습니까?

더 일반적으로 .NET에 더 일반적인 스레드 안전 수집 라이브러리 세트가 있는지 알고 싶어합니다. 또는 동시 유틸리티는 일반적으로 - 동등합니다 더그 레아'에스 java.util.concurrent 도서관.

도움이 되었습니까?

해결책

내가 아는 한에서는 아니다. 당신이 찾고있는 것과 가장 가까운 것은 아마도 해시 테이블의 동기화 된 방법 일 것입니다. 그러나 여러 작가 나 여러 독자에게는 스레드 안전입니다. 내가 올바르게 기억한다면, 작가와 독자의 혼합은 실로 안전하지 않을 것입니다.

다른 팁

들어오는 .NET 4.0에는 a가 있습니다 동시 소설 클래스, 편리합니다 getoradd 방법.

public TValue GetOrAdd(
    TKey key,
    Func<TKey, TValue> valueFactory
)

글로벌 서버 캐시에 매우 유용합니다.

편집 : 이것은 .NET 4가 출시되기 전에 작성되었습니다. ConcurrentDictionary. .NET 3.5가 필요한 사람들을위한 참조로 여기에두고 있습니다.

나는 어떤 것도 모른다 ConcurrentHashMap.

일반적인 동시 유틸리티 측면에서 - .NET은 항상 Java가 제공했던 기본보다 조금 더 많은 것을 제공했습니다. Mutex, ManualResetEvent, AutoResetEvent 그리고 ReaderWriterLock; 그리고 최근에 (.net 2.0) Semaphore 및 (.NET 3.5) ReaderWriterLockSlim - 물론 프로세스 전체 스레드 풀뿐만 아니라.

병렬 확장이 도착하면 .NET 4.0에 더 큰 흔들림이 발생합니다. 동시성을 만들어야합니다. 많이 더 간단합니다. 마찬가지로 조정 및 동시 런타임 마침내 Microsoft Robotics Studio의 족쇄에서 벗어나고 있지만 정확히 어디로 향하는지 (.NET 자체의 일부이든 별도의 라이브러리)는 분명하지 않습니다.

개인적으로, 개별 방법을 동기화하는 것은 일반적으로 소리만큼 유용하지 않다는 것을 알게됩니다.

일반적으로 관련 "get"및 "put"을 연속적으로 수행 할 수 있으며 다른 스레드가 동일한 값을보고 있으면 즉각적인 스레드 레이스가 있습니다. 마찬가지로 (시나리오에 따라) 그렇지 않습니다 원하다 누군가가 당신이 일하고있는 가치를 읽는 사람.

광범위한 접근 방식의 경우 단순히 외부를 사용합니다 Monitor (lock(...) 많은 상황에서 잘 작동 할 수 있습니다. 간단하고 가벼우 며, 당신이 아래에 있지 않는 한 무거운 스레드로드, 적절한 것 이상.

보다 복잡한 시나리오의 경우와 같은 것들이 있습니다 ReaderWriterLockSlim 등은 더 유연합니다. 그러나 나는 단순하게 시작하고 프로파일 링에 진정으로 논쟁적인 문제가 있음을 보여줄 경우 만 변경합니다.

Jon이 언급 한 바와 같이, 병렬 확장으로 완전히 새로운 고성능 동기화 장치가 나옵니다. 내가 볼 수있는 것에서 (예를 들어 여기, 여기 그리고 여기), 이것은 .NET 4.0의 일부입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top