>  기사  >  백엔드 개발  >  ConcurrentDictionary 멀티 스레드 동기화 사전 수집 예제 사용에 대한 자세한 설명

ConcurrentDictionary 멀티 스레드 동기화 사전 수집 예제 사용에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-24 09:48:2414264검색

지난 기간에는 대부분의 기본 클래스가 다중 스레드에서 캐시 충돌을 처리하기 위해 잠금과 Hashtable의 조합을 사용했습니다. 그러나 때때로 이 두 조합을 사용하는 것이 만족스럽지 않은 경우 컬렉션이 추가되었습니다. 코드를 여러 번 처리한 후에도 문제는 동일하게 유지되었습니다. 마침내 .NET 4.0 이후에 도입된 ConcurrentDictionary 다중 스레드 동기화 사전 컬렉션을 사용하여 문제가 성공적으로 해결되었습니다.

1. Lock과 Hashtable의 조합을 사용하여 구현

내 기본 클래스에서 비즈니스 개체를 빌드합니다. 일반적으로 BLLFactory.Instance를 사용하여 해당 비즈니스 개체를 적용할 수 있습니다.

var result = BLLFactory<Customer>.Instance.FindFirst();
Console.WriteLine(result.ToJson());

그러므로 BLLFactory.Instance를 사용하여 객체를 구성한 후 이를 HashTable에 넣습니다. 다중 스레드 충돌 처리를 설계해야 하므로 잠금 처리를 구현하려면 잠금 객체를 사용해야 합니다.

HashTable은 키/값 쌍의 모음을 나타냅니다. .NET Framework에서 Hashtable은 System.Collections 네임스페이스에서 제공하는 컨테이너로 키-값 쌍을 처리하고 나타내는 데 사용됩니다. 키는 일반적으로 빠른 검색에 사용될 수 있으며 값은 대/소문자를 구분합니다. 키에 해당하는 값을 저장하는 데 사용됩니다. Hashtable의 키-값 쌍은 모두 객체 유형이므로 Hashtable은 모든 유형의 키-값 쌍을 지원할 수 있으며 null이 아닌 모든 객체를 키 또는 값으로 사용할 수 있습니다.

이 방법을 사용하면 웹 측에서 다중 스레드 액세스 충돌이 계속 발생하는 경우가 있으므로 다중 스레드 테스트 코드를 사용하여 오류를 테스트하고 재현할 수도 있습니다. 추적 코드는 다음과 같습니다.

따라서 위의 코드에서 볼 수 있듯이 lock(syncRoot)을 사용해도 멀티스레드 충돌 문제가 발생할 수 없습니다.

2. Hashtable 대신 ConcurrentDictionary를 사용하세요

ConcurrentDictionary는 .net4.0에서 출시된 스레드 안전 컬렉션 세트 중 하나입니다. 또한 ConcurrentStack, ConcurrentQueue 및 기타 유형의 단일 스레드 버전도 함께 출시되었습니다. 스레드가 안전하지 않은(큐, 스택, 사전)에 확실히 익숙할 것입니다. ConcurrentDictionary<

TKey,

TValue>

는 동시에 여러 스레드에서 액세스할 수 있으며 스레드로부터 안전하지만 사용법은 Dictionary와 동일합니다. ConcurrentDictionary는 System.Collections.Concurrent 네임스페이스에 속합니다.

System.Collections.Concurrent 네임스페이스는 여러 스레드로부터 안전한 컬렉션 클래스를 제공합니다. 여러 스레드가 동시에 컬렉션에 액세스하는 경우 System.Collections 및 System.Collections.Generic 네임스페이스

의 해당 유형 대신 이러한 클래스를 사용해야 합니다. ConcurrentDictionary 이 클래스는 컬렉션 처리를 위해 다음과 같은 메소드를 제공합니다.

            try{
                List<Thread> list = new List<Thread>();for (int i = 0; i < 10; i++)
                {
                    Thread thread = new Thread(() =>{var result = BLLFactory<Customer>.Instance.FindFirst();
                        Console.WriteLine(result.ToJson());
                        Console.WriteLine();
                    });

                    list.Add(thread);
                }for (int i = 0; i < list.Count; i++)
                {
                    list[i].Start();
                }
            }catch(Exception ex)
            {
                LogTextHelper.Error(ex);
            }

ConcurrentDictionary를 사용하여 Hashtable을 대체하려면 아래와 같이 BLLFactory 클래스의 구현 코드를 살펴보겠습니다.

public bool TryAdd(TKey key, TValue value)public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)public TValue this[TKey key] { get; set; }public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)    
public TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> updateValueFactory)public TValue GetOrAdd(TKey key, TValue value)public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)

코드가 많이 단순화된 것을 볼 수 있으며, 기존 멀티스레드 테스트 코드를 사용하면 예외 없이 원활하게 데이터를 얻을 수 있습니다.

실행 중인 코드를 원활하게 구현할 수 있으며 Hashtable을 사용하기 전에 발생한 멀티 스레드 액세스 예외가 발생하지 않습니다.

위는 멀티 스레드 객체 캐싱을 위해 Hashtable을 대체하는 ConcurrentDictionary를 도입한 것입니다. 문제가 원활하게 해결되면 액세스 효율성도 이전에 비해 향상되어 일석이조인 것으로 나타났습니다. .

위 내용은 ConcurrentDictionary 멀티 스레드 동기화 사전 수집 예제 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.