Scenarii frecvente de abuz: Pentru a preveni plata duplicată a comenzilor cauzată de faptul că utilizatorii au apăsat accidental butonul de plată de mai multe ori, folosim blocarea (numărul comenzii) pentru a ne asigura că doar un fir de discuție are voie să efectueze operațiunea pe comandă.
Această idee este bună, cel puțin mai bună decât lock-ul (un obiect static privat pentru procesarea claselor), deoarece efectul numărului de ordine de blocare este să blocheze doar operațiunea ordinului curent 1, iar dacă variabila statică blochează, adică blochează toate ordinele, va determina ca toate ordinele să fie puse la coadă, ceea ce este evident nerezonabil.
Deci, poate metoda încuietoare (numărul de comandă) menționată la începutul acestui articol să obțină efectul dorit? Hai să folosim niște cod pentru a restaura mai întâi scenariul de utilizare.
Dacă ignori informațiile utilizatorului și alte validări, codul arată cam așa:
Pentru cuvântul cheie al lacătului, MSDN include informații care pot fi găsite pe Baidu, iar se pare că se recomandă să nu se folosească lock(string), motivul fiind același. Următorul pasaj este preluat din sfaturile MSDN despre șirurile de încuietoare:
Problema lock("myLock") apare pentru că orice alt cod care folosește același șir în proces va împărți aceeași blocare. Această propoziție ascunde un mecanism uriaș, și anume "același fir".
Ce este "aceeași coardă"? Vezi codul:
Str1 și str2 sunt același string de mai sus? Răspunsul este DA.
Vezi din nou:
St1 și str2 de deasupra sunt încă aceeași coardă? Răspunsul este NU.
Bine, să revenim la problema plății comenzii. În codul nostru, lock(orderNumber), când utilizatorul dă click din greșeală de câteva ori după ce își trece mâna, orderNumber introduce această acțiune este același șir de fiecare dată? Răspunsul este NU. Adică
Codul care gestionează comanda de mai sus nu acționează de fapt ca un blocat.
De fapt, există două tipuri de comparații de șiruri, vezi codul:
Prima linie a codului de mai sus afișează True, iar a doua linie produce False. Cred că înțelegi ce înseamnă MSDN prin "același șir" fără explicația mea.
Cea mai bună soluție
Soluții pentru șiruri de blocare optime:
Cod demo:
Pe site, uneori poate fi folosită o variabilă globală, această variabilă globală, când mai mulți utilizatori accesează simultan, poate părea anormală; în acest moment, vom seta un blocaj global, dar dezavantajul este că toate accesurile vor aștepta pe rând.
În unele situații, de exemplu, același utilizator poate comenta o singură dată în 15 secunde; dacă se folosește blocarea globală, funcția de comentarii va fi foarte lentă în procesare atunci când numărul de utilizatori crește, ceea ce va afecta semnificativ experiența utilizatorului.
În acest moment,Putem seta blocajul pentru fiecare utilizator individual, lock(string){...}, iar numele blocajului poate fi definit astfel:Numele metodei + ID-ul utilizatoruluiAstfel, fiecare utilizator are un blocaj independent, iar la evaluarea intervalului de comentarii, acesta nu va afecta comentariile celorlalți utilizatori.
(Sfârșit)
|