I have a class (singleton) and it contains a static Dictionary
private static Dictionary<string, RepositoryServiceProvider> repositoryServices = null;
in the instance of this class I populate the dictionary (can occur from multiple threads). At first I had just
RepositoryServiceProvider service = null;
repositoryServices.TryGetValue(this.Server.Name, out service);
if (service == null) {
service = new RepositoryServiceProvider(this.Server);
repositoryServices.Add(this.Server.Name, service);
}
then I got some exceptions as Item already added so I changed it to:
RepositoryServiceProvider service = null;
repositoryServices.TryGetValue(this.Server.Name, out service);
if (service == null) {
lock (padlock) {
repositoryServices.TryGetValue(this.Server.Name, out service);
if (service == null) {
service = new RepositoryServiceProvider(this.Server);
repositoryServices.Add(this.Server.Name, service);
}
}
}
and padlock is in the class:
private static readonly object padlock = new object();
is this thread safe? or its overcomplicated? or should I use ConcurentDictionary ?
IF you can use ConcurrentDictionary
- it is in several situations faster than your approach because it implements most operations lock-free while being thread-safe.
EDIT - as per comments:
The term "most operations lock-free" is a bit too general...
Basically it means reduced contention ... thus in some cases more efficiency compared to a situation with one global lock, ie accessing a second bucket while the first bucket is locked works as if there was no lock from the POV of the accessing code... although that means a lock local to that bucket... in real-world applications it delivers much better performance than a global lock - esp. with multi-core.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.