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)
|