Vanlige misbruksscenarier: For å forhindre dobbeltbetaling av ordre forårsaket av at brukere ved et uhell trykker på betalingsknappen flere ganger, bruker vi lock (ordrenummer) for å sikre at kun én tråd får utføre operasjonen på ordren.
Denne ideen er god, i hvert fall bedre enn lock (et privat statisk objekt for å behandle klasser), fordi effekten av å låse ordrenummer er å låse kun operasjonen til den nåværende 1-ordenen, og hvis lås statisk variabel, altså å låse alle ordre, vil alle ordrer bli satt i kø, noe som åpenbart er urimelig.
Så kan låsemetoden (ordrenummer) som nevnes i begynnelsen av denne artikkelen oppnå ønsket effekt? La oss bruke litt kode for å gjenopprette bruksscenariet først.
Hvis du ignorerer brukerinformasjon og andre valideringer, ser koden omtrent slik ut:
Når det gjelder nøkkelordet lock, inkluderer MSDN informasjon som finnes på Baidu, og det virker som det anbefales å ikke bruke lock(string), og grunnen er den samme. Følgende avsnitt er hentet fra MSDNs råd om låsestrenger:
Lock("myLock")-problemet oppstår fordi all annen kode som bruker samme streng i prosessen vil dele samme lås. Denne setningen skjuler en enorm mekanisme, nemlig «samme streng».
Hva er «den samme strengen»? Se koden:
Er str1 og str2 samme streng over? Svaret er JA.
Se igjen:
Er str1 og str2 ovenfor fortsatt samme streng? Svaret er NEI.
Ok, la oss gå tilbake til spørsmålet om bestillingsbetalingen vår. I vår kode, lock(orderNumber), når brukeren ved et uhell klikker noen ganger til etter å ha sveipet hånden, er orderNumber som taster inn denne handlingen i samme streng hver gang? Svaret er NEI. Dette vil si
Koden som håndterer ordren ovenfor fungerer faktisk ikke som en lås.
Faktisk finnes det to typer strengsammenligninger, se koden:
Den første linjen i koden ovenfor gir True, og den andre linjen gir False. Jeg tror du forstår hva MSDN mener med «samme streng» uten min forklaring.
Den beste løsningen
Løsninger for optimale låsestrenger:
Demokode:
På nettsiden kan det noen ganger brukes en global variabel, denne globale variabelen, når flere brukere får tilgang samtidig, kan virke unormal; på dette tidspunktet setter vi en global lås, men ulempen med dette er at alle tilganger venter etter tur.
I noen scenarioer, for eksempel, kan samme bruker bare kommentere én gang innen 15 sekunder; hvis den globale låsen brukes, vil kommentarfunksjonen være veldig treg å behandle når antallet brukere øker, noe som vil påvirke brukeropplevelsen betydelig.
På dette tidspunktet,Vi kan sette låsen for hver bruker individuelt, lock(string){...}, og navnet på låsen kan defineres som:Metodenavn + bruker-IDPå denne måten har hver bruker en uavhengig lås, og når man vurderer kommentarintervallet, vil det ikke påvirke andre brukeres kommentarer.
(Slutt)
|