Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 193519|Svar: 11

[Kilde] .net/c# Bruger multitrådet samtidighedslås(streng){...} Detaljeret forklaring

[Kopier link]
Opslået på 03/07/2019 15.25.19 | | | |
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)




Tidligere:MFC's LPSTR-skriftskrivning
Næste:OpenSSL er åbenlyst blevet opdateret, Apache prompter stadig den gamle version?
Opslået på 13/05/2022 14.27.17 |
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.
 Udlejer| Opslået på 12/08/2023 19.48.15 |
.NET/C# Lock Principle Monitor giver en dybdegående forklaring
https://www.itsvse.com/thread-9633-1-1.html
Opslået på 07/01/2023 11.22.02 |
Jeg stødte også på det i min arbejdspraksis, takket være forfatteren til denne tekniske artikel
Opslået på 03/07/2019 20.02.32 |
Det her er godt stof
Opslået på 18/06/2021 14.24.43 |
Det, der vises på siden, er, at koden ikke kan vises
Opslået på 29/06/2021 00.21.16 |
Se på koden
Opslået på 29/06/2021 00.54.24 |
Jeg kan ikke se koden
Opslået på 14/05/2022 10.06.46 |
Lær at lære
Opslået på 28/05/2022 22.03.59 |
Meget godt, lært
Opslået på 28/11/2022 21.46.47 |
Kan asp.net bruges?
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com