Wie sperre ich Objekte mit denselben IDs?

8

Ich habe den folgenden Code:

%Vor%

Methode Update kann in zwei oder mehr Threads ausgeführt werden und ich verwende lock , um Probleme mit der Konsistenz mit foo zu verhindern. Aber ich möchte nur die Foo sperren, die ähnliche Id haben. Wenn beispielsweise ein Thread die Methode Update mit Foo.Id = 1 ausführt und ein anderer Thread Update mit Foo.Id = 2 ausführt, dann wird lock nicht benötigt und wenn zwei Threads Update mit zwei Instanzen Foo mit dem ausführen selbe Id , lock wird benötigt. Ist es möglich, ein solches Schloss zu erstellen?

    
Pupkin 23.10.2017, 11:46
quelle

3 Antworten

3

Sie können ConcurrentDictionary<TKey, TValue> zum Speichern Ihrer Sperren verwenden .

%Vor%

Und benutze es in Update-Methode:

%Vor%     
Fabjan 23.10.2017 12:21
quelle
3

Sie können diese Klasse verwenden, um ein Sperrobjekt für jede Id zu erhalten:

%Vor%

Halten Sie dann eine Instanz davon in Ihrer Klasse:

%Vor%

Die Verwendung ist einfach:

%Vor%     
Tim Schmelter 23.10.2017 12:10
quelle
2

Sie können nur lock(foo) , wenn Sie sicher sind

  • kein anderer Code verwendet foo zum Sperren von
  • Referenzgleichheit (Identität) ist akzeptabel / verwendbar, dies verwendet nicht Id

Sie können int Id nicht sperren.

Teil 2,

  

Leider verwende ich verschiedene Instanzen von Foo mit der gleichen ID

Dann könnten Sie pro ConcurrentDictionary<int, object> versuchen, einen anderen _locker pro Id zu speichern. Aber das bringt zusätzlichen Aufwand und das Problem, das Dictionary zu bereinigen, wenn Sie es längere Zeit ausführen.

    
Henk Holterman 23.10.2017 11:51
quelle