Almindelige misbrugsscenarier: For at forhindre dobbeltbetaling af ordrer forårsaget af, at brugere ved et uheld klikker på betalingsknappen flere gange, bruger vi lock (ordrenummer) for at sikre, at kun én tråd får lov til at udføre operationen på ordren.
Denne idé er god, i hvert fald bedre end lock (et privat statisk objekt til behandling af klasser), fordi effekten af at låse ordrenummer kun låser operationen af den aktuelle 1-ordre, og hvis lås statisk variabel, altså låser alle ordrer, vil alle ordrer blive sat i kø, hvilket åbenlyst er urimeligt.
Så kan låsemetoden (ordrenummer), der nævnes i begyndelsen af denne artikel, opnå den ønskede effekt? Lad os bruge noget kode til at gendanne brugsscenariet først.
Hvis du ignorerer brugerinformation og andre valideringer, ser koden stort set sådan ud:
For nøgleordet lock indeholder MSDN information, der kan findes på Baidu, og det ser ud til, at det anbefales ikke at bruge lock(string), og grunden er den samme. Følgende passage er taget fra MSDN's råd om låsestrenge:
Lock("myLock")-problemet opstår, fordi enhver anden kode, der bruger den samme streng i processen, vil dele den samme lås. Denne sætning skjuler en enorm mekanisme, nemlig "den samme streng".
Hvad er "den samme streng"? Se koden:
Er str1 og str2 den samme streng ovenfor? Svaret er JA.
Se igen:
Er str1 og str2 ovenfor stadig den samme streng? Svaret er NEJ.
Okay, lad os vende tilbage til spørgsmålet om vores ordrebetaling. I vores kode, lock(orderNumber), når brugeren ved et uheld klikker et par gange mere efter at have swipet med hånden, er orderNumber så den samme streng, der indtaster denne handling, hver gang? Svaret er NEJ. Det vil sige
Koden, der håndterer ovenstående ordre, fungerer faktisk ikke som en lås.
Faktisk findes der to typer strengsammenligninger, se koden:
Den første linje i ovenstående kode udgiver True, og den anden linje udgiver False. Jeg tror, du forstår, hvad MSDN mener med "den samme streng" uden min forklaring.
Den bedste løsning
Løsninger til optimale låsestrenge:
Demokode:
På hjemmesiden kan der nogle gange bruges en global variabel; denne globale variabel, når flere brugere tilgår samtidig, kan virke unormal; på dette tidspunkt sætter vi en global lås, men ulempen ved dette er, at alle adgange venter på skift.
I nogle scenarier kan den samme bruger for eksempel kun kommentere én gang inden for 15 sekunder; hvis den globale lås bruges, vil kommentarfunktionen være meget langsom at behandle, når antallet af brugere stiger, hvilket vil påvirke brugeroplevelsen betydeligt.
På dette tidspunkt,Vi kan sætte låsen for hver bruger individuelt, lock(string){...}, og navnet på låsen kan defineres som:Metodenavn + bruger-IDPå denne måde har hver bruger en uafhængig lås, og når man vurderer kommentarintervallet, vil det ikke påvirke andre brugeres kommentarer.
(Slut)
|