Typowe scenariusze niewłaściwego użycia: Aby zapobiec duplikatowi płatności zleceń spowodowanym przypadkowym wielokrotnym kliknięciem przycisku płatności, używamy blokady (numer zamówienia), aby zapewnić, że tylko jeden wątek może wykonać operację na zleceniu.
Ten pomysł jest dobry, przynajmniej lepszy niż blokada (prywatny statyczny obiekt do przetwarzania klas), ponieważ efektem blokowania numeru zamówienia jest zablokowanie tylko operacji bieżącego zamówienia 1, a jeśli zablokuje zmienną statyczną, czyli blokuje wszystkie zlecenia, spowoduje kolejkowanie wszystkich poleceń, co jest oczywiście nierozsądne.
Czy metoda blokady (numer zamówienia) wspomniana na początku tego artykułu może osiągnąć pożądany efekt? Najpierw użyjmy kodu, aby przywrócić sytuację użytkowania.
Jeśli zignorujesz informacje użytkownika i inne weryfikacje, kod wygląda mniej więcej tak:
Jeśli chodzi o słowo kluczowe z zakleszczeniem, MSDN zawiera informacje dostępne na Baidu i wydaje się, że zaleca się nie używać lock(string), a powód jest ten sam. Poniższy fragment pochodzi z porad MSDN dotyczących stringów blokujących:
Problem z blokadą ("myLock") pojawia się, ponieważ każdy inny kod używający tego samego ciągu w procesie będzie miał ten sam zamek. To zdanie ukrywa ogromny mechanizm, czyli "ten sam ciąg".
Co to jest "ten sam sznur"? Zobacz kod:
Czy str1 i str2 to ta sama struna powyżej? Odpowiedź brzmi: TAK.
Zobacz ponownie:
Czy str1 i str2 powyżej to nadal ta sama struna? Odpowiedź brzmi: NIE.
Dobrze, wróćmy do kwestii płatności zamówienia. W naszym kodzie, lock(orderNumber), gdy użytkownik przypadkowo kliknie kilka razy po przesunięciu ręką, czy numer zamówienia wpisujący tę akcję jest tym samym ciągiem za każdym razem? Odpowiedź brzmi: NIE. To znaczy
Kod obsługujący powyższą kolejność nie działa faktycznie jako blokada.
W rzeczywistości istnieją dwa rodzaje porównań ciągów znaków, zobacz kod:
Pierwsza linia powyższego kodu daje Prawda, a druga linia Fałszywa. Wydaje mi się, że rozumiesz, co MSDN oznacza "ten sam ciąg" bez mojego wyjaśnienia.
Najlepsze rozwiązanie
Rozwiązania dla optymalnych sznurów blokujących:
Kod demonstracyjny:
Na stronie internetowej czasem może być użyta zmienna globalna, która przy jednoczesnym dostępie wielu użytkowników może wydawać się nienormalna; wtedy ustawiamy globalną blokadę, ale wadą jest to, że wszystkie dostępy będą czekać na kolejno.
W niektórych sytuacjach, na przykład, ten sam użytkownik może skomentować tylko raz w ciągu 15 sekund, jeśli użyje się globalnego zamknięcia, funkcja komentarza będzie bardzo wolna w przetwarzaniu liczby użytkowników, co znacznie wpłynie na doświadczenie użytkownika.
W tym momencie,Możemy ustawić blokadę dla każdego użytkownika osobno, lock(string){...}, a nazwa blokady może być zdefiniowana jako:Nazwa metody + identyfikator użytkownikaW ten sposób każdy użytkownik ma niezależną blokadę, a przy ocenie interwału komentarzy nie wpływa to na komentarze innych użytkowników.
(Koniec)
|