Häufige Missbrauchsszenarien: Um doppelte Zahlungen von Bestellungen zu verhindern, die durch mehrfaches Drücken der Zahlungstaste verursacht werden, verwenden wir Lock (Bestellnummer), um sicherzustellen, dass nur ein Thread die Operation an der Bestellung ausführen darf.
Diese Idee ist gut, zumindest besser als Lock (ein privates statisches Objekt zur Verarbeitung von Klassen), denn die Wirkung der Locking-Ordernummer besteht darin, nur die Operation der aktuellen 1-Ordnung zu sperren, und wenn eine statische Variable, also alle Aufträge blockiert, werden alle Bestellungen in die Warteschlange gestellt, was offensichtlich unzumutbar ist.
Kann also die am Anfang dieses Artikels erwähnte Lock-(Ordernummer-)Methode den gewünschten Effekt erzielen? Lass uns zuerst etwas Code verwenden, um das Nutzungsszenario wiederherzustellen.
Wenn man Benutzerinformationen und andere Validierungen ignoriert, sieht der Code ungefähr so aus:
Für das Schlüsselwort Lock enthält MSDN Informationen, die auf Baidu zu finden sind, und es scheint, dass empfohlen wird, Lock (String) nicht zu verwenden, und der Grund ist derselbe. Die folgende Passage stammt aus MSDNs Rat zu Lockstrings:
Das Lock("myLock")-Problem tritt auf, weil jeder andere Code, der denselben String im Prozess verwendet, dasselbe Schloss teilt. Dieser Satz verbirgt einen riesigen Mechanismus, nämlich "denselben String".
Was ist "die gleiche Saite"? Siehe den Code:
Sind Str1 und Str2 dieselbe Saite oben genannt? Die Antwort lautet JA.
Siehe nochmal:
Sind Str1 und Str2 oben immer noch dieselbe Saite? Die Antwort lautet NEIN.
Okay, kommen wir zurück zum Thema unserer Bestellzahlung. In unserem Code, lock(orderNumber), wenn der Benutzer nach dem Wischen seiner Hand versehentlich noch ein paar Mal klickt, ist die OrderNumber dann jedes Mal dieselbe Zeichenkette, die diese Aktion eingibt? Die Antwort lautet NEIN. Das heißt,
Der Code, der die obige Reihenfolge abwickelt, wirkt tatsächlich nicht als Sperre.
Tatsächlich gibt es zwei Arten von String-Vergleichen, siehe den Code:
Die erste Zeile des obigen Codes gibt True aus, und die zweite Zeile gibt False aus. Ich glaube, du verstehst, was MSDN mit "derselben String" meint, ohne meine Erklärung.
Die beste Lösung
Lösungen für optimale Locking Strings:
Demo-Code:
Auf der Website kann manchmal eine globale Variable verwendet werden; diese globale Variable kann abnormal erscheinen, wenn mehrere Benutzer gleichzeitig zugreifen; zu diesem Zeitpunkt setzen wir eine globale Sperre, aber der Nachteil ist, dass alle Zugriffe nacheinander warten.
In manchen Szenarien kann derselbe Nutzer beispielsweise nur innerhalb von 15 Sekunden kommentieren; wenn die globale Sperre verwendet wird, wird die Kommentarfunktion sehr langsam verarbeitet, wenn die Nutzerzahl stark steigt, was das Nutzererlebnis stark beeinflusst.
Zu dieser Zeit,Wir können das Schloss für jeden Benutzer einzeln festlegen, lock(string){...}, und der Name des Schlosses kann definiert werden als:Methodenname + Benutzer-IDAuf diese Weise hat jeder Nutzer eine unabhängige Sperre, und wenn man das Kommentarintervall beurteilt, wirkt sich das nicht auf die Kommentare anderer Nutzer aus.
(Ende)
|