Dokumentacja ConcurrentDictionary
nie wyraźny stan, więc myślę, że nie możemy oczekiwać, że delegaci valueFactory
i updateValueFactory
mieć ich wykonanie zsynchronizowane (z GetOrAdd() i AddOrUpdate() operacje odpowiednio).Pułapka ConcurrentDictionary - Czy fabryki delegatów z GetOrAdd i AddOrUpdate są zsynchronizowane?
Uważam więc, że nie możemy zaimplementować wykorzystania zasobów wewnątrz nich, które wymagają równoczesnej kontroli bez ręcznego wdrażania naszego własnego kontrolera współbieżnego, może po prostu używając [MethodImpl(MethodImplOptions.Synchronized)]
nad delegatami.
Mam rację? Albo fakt, że ConcurrentDictionary
jest bezpieczny dla wątków, możemy oczekiwać, że wywołania do tych delegatów są automatycznie synchronizowane (również wątkowo)?
Tak więc pakuję wywołanie metody GetOrAdd w blokadę, ale to powoduje, że cel ConcurrentDictionary jest bezużyteczny. Czy istnieje najlepszy sposób? – John
Jestem nieco zdezorientowany przez to, czy w zasadzie mówimy, że jeśli delegat zostanie przekazany jako klucz, to jego wykonanie nie zostanie zsynchronizowane przy ocenie wartości *? Lub jeśli mamy słownik z typem "delegate" jako wartością ... że kiedy próbujemy wykonać delegata (to znaczy 'słownik [klucz] (argument);'), że wykonanie nie zostanie zsynchronizowane? Czy też całkowicie pomijam ten punkt? Dzięki. – Snoopy
@Snoopy: Delegat oceniający wartość do dodania nie jest zsynchronizowany. Oznacza to, że jeśli twój delegat zrobi coś, co nie jest bezpieczne dla wątków * i * nie spróbujesz sam zsynchronizować tej operacji, wtedy zdarzą się złe rzeczy. Ale rzeczą, której delegat działający jako fabryka wartości nie będzie zazwyczaj robić rzeczy, które z natury nie są bezpieczne dla wątków. Przez większość czasu delegat prawdopodobnie po prostu robi 'new SomeObject()', który jest z pewnością wątkowo bezpieczny, ponieważ jest operacją bezstanową. –