Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 193519|Svare: 11

[Kilde] .net/c# Bruker multitrådet samtidighetslås(streng){...} Detaljert forklaring

[Kopier lenke]
Publisert på 03.07.2019 15:25:19 | | | |
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)




Foregående:MFCs LPSTR-skrift
Neste:OpenSSL har åpenbart blitt oppdatert, Apache sender fortsatt den gamle versjonen?
Publisert på 13.05.2022 14:27:17 |
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.
 Vert| Publisert på 12.08.2023 19:48:15 |
.NET/C# Lock Principle Monitor gir en grundig forklaring
https://www.itsvse.com/thread-9633-1-1.html
Publisert på 07.01.2023 11:22:02 |
Jeg støtte også på det i min arbeidserfaring, takket være forfatteren for denne tekniske artikkelen
Publisert på 03.07.2019 20:02:32 |
Dette er bra saker
Publisert på 18.06.2021 14:24:43 |
Det som vises på siden er at koden ikke kan vises
Publisert på 29.06.2021 00:21:16 |
Se på koden
Publisert på 29.06.2021 00:54:24 |
Jeg kan ikke se koden
Publisert på 14.05.2022 10:06:46 |
Lær å lære
Publisert på 28.05.2022 22:03:59 |
Veldig bra, lært
Publisert på 28.11.2022 21:46:47 |
Kan asp.net brukes?
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com