Mam klasę, która jest zaprojektowana przede wszystkim jako klasa POCO, z różnymi wątkami i zadaniami może odczytać jej wartości, a tylko inne tylko sporadycznie aktualizując te wartości. Wydaje się to być idealnym scenariuszem dla ReaderWriterLockSlim.Czy blokowanie dostępu do żądanego bool jest wymagane lub czy to przesada
Pytanie, czy w klasie właściwość, która musi być zabezpieczona wątkiem, czy nieruchomość jest boolem, to ta przesada? co się dzieje, jeśli jest to int? DateTime?
public class MyClass
{
private bool _theValue = false;
private ReaderWriterLockSlim _theValueLock = new ReaderWriterLockSlim();
public bool TheValue
{
get
{
bool returnVal = false;
try
{
_theValueLock.EnterReadLock();
returnVal = _theValue;
}
finally
{ _theValueLock.ExitReadLock(); }
return returnVal;
}
set
{
try
{
_theValueLock.EnterWriteLock();
_theValue = value;
}
finally
{ _theValueLock.ExitWriteLock(); }
}
}
}
Czy cały ten kod przesadą i prosty ...
public bool TheValue { get; set; }
... byłaby wystarczająca? Ponieważ typ to bool, czy jest bezpieczny? jeśli tak, to kiedy to nie jest bezpieczne? bajt? int? DateTime?
edytuj
Moja podstawowa architektura to mieć ten stan sklepu klasowego. Może mieć jedną usługę odpowiedzialną za robienie zapisów na tę klasę. Wszystkie pozostałe klasy mogą czytać i wykonywać swoją logikę na podstawie tych danych stanu. Zrobię co w mojej mocy, aby upewnić się, że wszystkie dane są spójne, ale, jak stwierdzono poniżej, moim głównym zmartwieniem była atomowość i splinching danych.
Wniosek
Dziękuję wszystkim za odpowiedź, wszystkie były cenne. Moim głównym zmartwieniem była niepodzielność zapisów/odczytów (tj. Martwienie się o splinching). W przypadku platformy .NET, jeśli dana zmienna jest wbudowanym typem wartości, który ma mniej niż 4 bajty, to odczyt i zapis są atomowe (np. Krótkie i int są dobre, długie i podwójne nie są).
Nie ochrona jest bardzo ciężka pod zabiciem. Nie można uzyskać dokładnej odpowiedzi, nie pokazując, w jaki sposób usługa jest używana. Blokowanie na poziomie nieruchomości bardzo rzadko działa. –
więcej dla własnego użytku niektóre linki [link] (http://www.albahari.com/threading/) najlepsze praktyki dotyczące wątków, [link] (http://blogs.msdn.com/b/ericlippert/archive/ 2011/05/26/atomicity-volatility-and-immutability-are-different-part-one.aspx) atmoicity, voltile dzięki @brian, [link] (http://blogs.msdn.com/b/brada/ archiwum/2003/04/03/49896.aspx) szybka lektura na temat atomowości dzięki @reed – Andre
Jako osobistą notatkę, słuchając komentarzy dnr.tv i jon skeet na temat blokowania booli, przejrzałem ten http://askjonskeet.com/answer/6873994/Boolean-Property-Getter-and-Setter-Locking, który zasadniczo mówi, że w scenariuszach wielowątkowych dobrze jest go zablokować. – Andre