Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 193519|Svar: 11

[Källa] .net/c# Användaren multitrådad samtidighetslås(sträng){...} Detaljerad förklaring

[Kopiera länk]
Publicerad på 2019-07-03 15:25:19 | | | |
Vanliga missbruksscenarier: För att förhindra dubbla betalningar av order orsakade av att användare av misstag klickar på betalningsknappen flera gånger, använder vi lock (ordernummer) för att säkerställa att endast en tråd får utföra operationen på ordern.

Denna idé är bra, åtminstone bättre än lock (ett privat statiskt objekt för att bearbeta klasser), eftersom effekten av att låsa ordernummer är att endast låsa operationen av den aktuella 1-ordningen, och om låsa statisk variabel, det vill säga låsa alla order, kommer alla order att köas, vilket uppenbarligen är orimligt.

Så kan låsmetoden (ordernummer) som nämns i början av denna artikel uppnå önskad effekt? Låt oss använda lite kod för att återställa användningsscenariot först.

Om du ignorerar användarinformation och andra valideringar ser koden ungefär ut så här:
När det gäller nyckelordet lås innehåller MSDN information som finns på Baidu, och det verkar rekommenderas att inte använda lås (string), och anledningen är densamma. Följande passage är hämtad från MSDN:s råd om låssträngar:

Problemet med låset ("myLock") uppstår eftersom all annan kod som använder samma sträng i processen delar samma lås.
Denna mening döljer en enorm mekanism, nämligen "samma sträng".

Vad är "samma sträng"? Se koden:


Är str1 och str2 samma sträng ovan? Svaret är JA.

Se igen:


Är str1 och str2 ovanför fortfarande samma sträng? Svaret är NEJ.

Okej, låt oss gå tillbaka till frågan om vår beställningsbetalning. I vår kod, lock(orderNumber), när användaren av misstag klickar några gånger till efter att ha svept handen, är orderNumber som matar in denna handling samma sträng varje gång? Svaret är NEJ. Det vill säga

Koden som hanterar ordern ovan fungerar faktiskt inte som ett lås.

Faktum är att det finns två typer av strängjämförelser, se koden:


Den första raden i ovanstående kod ger True, och den andra raden ger False. Jag tror att du förstår vad MSDN menar med "samma sträng" utan min förklaring.

Den bästa lösningen

Lösningar för optimala låssträngar:





Demokod:




På webbplatsen kan ibland en global variabel användas, denna globala variabel, när flera användare använder samtidigt kan verka onormal, vid denna tidpunkt sätter vi ett globalt lås, men nackdelen är att alla åtkomster väntar i tur och ordning.

I vissa scenarier kan till exempel samma användare bara kommentera en gång inom 15 sekunder, om det globala låset används kommer kommentarsfunktionen att vara mycket långsam att hantera när antalet användare ökar, vilket påverkar användarupplevelsen kraftigt.

Vid denna tidpunkt,Vi kan ställa in låset för varje användare individuellt, lock(string){...}, och namnet på låset kan definieras som:Metodnamn + användar-IDPå så sätt har varje användare ett oberoende lås, och när man bedömer kommentarsintervallet påverkar det inte andra användares kommentarer.

(Slut)




Föregående:MFC:s LPSTR-typsnitt
Nästa:OpenSSL har uppenbarligen uppdaterats, Apache skickar fortfarande den gamla versionen?
Publicerad på 2022-05-13 14:27:17 |
Så kan låsmetoden (ordernummer) som nämns i början av denna artikel uppnå önskad effekt? Låt oss använda lite kod för att återställa användningsscenariot först.
 Hyresvärd| Publicerad på 2023-08-12 19:48:15 |
.NET/C# Lock Principle Monitor ger en djupgående förklaring
https://www.itsvse.com/thread-9633-1-1.html
Publicerad på 2023-01-07 11:22:02 |
Jag stötte också på det i mitt arbete, tack vare författaren för denna tekniska artikel
Publicerad på 2019-07-03 20:02:32 |
Det här är bra grejer
Publicerad på 2021-06-18 14:24:43 |
Det som visas på sidan är att koden inte kan visas
Publicerad på 2021-06-29 00:21:16 |
Titta på koden
Publicerad på 2021-06-29 00:54:24 |
Jag kan inte se koden
Publicerad på 2022-05-14 10:06:46 |
Lär dig att lära dig
Publicerad på 2022-05-28 22:03:59 |
Mycket bra, lärt mig
Publicerad på 2022-11-28 21:46:47 |
Kan asp.net användas?
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com