Pogosti primeri zlorabe: Da bi preprečili podvajanje plačil naročil, ki jih povzročijo uporabniki, ki po nesreči večkrat kliknejo gumb za plačilo, uporabljamo zaklep (številko naročila), da zagotovimo, da je operacija na naročilu dovoljena le ena nit.
Ta ideja je dobra, vsaj boljša kot zaklepanje (zasebni statični objekt za obdelavo razredov), saj učinek zaklepanja števila naročil je, da zaklene le operacijo trenutnega 1 naročila, in če zaklene statično spremenljivko, torej zaklene vse ukaze, povzroči, da bodo vsi ukazi v vrsti, kar je očitno nerazumno.
Ali lahko metoda ključavnice (številka naročila), omenjena na začetku tega članka, doseže želeni učinek? Najprej uporabimo nekaj kode za obnovitev scenarija uporabe.
Če prezrete uporabniške informacije in druge potrditve, koda izgleda približno takole:
Za ključavnico MSDN vključuje informacije, ki jih je mogoče najti na Baidu, in zdi se, da se ne priporoča uporaba lock(string), razlog pa je enak. Naslednji odlomek je vzet iz MSDN-jevega nasveta o zaklepnih vrvicah:
Težava z zaklepanjem ("myLock") nastane, ker bo vsaka druga koda, ki uporablja isti niz v procesu, delila isto ključavnico. Ta stavek skriva ogromen mehanizem, to je "isto vrvico".
Kaj je "ista struna"? Oglejte si kodo:
Ali sta str1 in str2 ista struna zgoraj? Odgovor je DA.
Glej še enkrat:
Ali sta str1 in str2 zgoraj še vedno ista struna? Odgovor je NE.
V redu, vrnimo se k vprašanju plačila naročila. V naši kodi, lock(orderNumber), ko uporabnik po nesreči klikne še nekajkrat po potegou roke, ali je orderNumber, ki vnaša to dejanje vsakič, isti niz? Odgovor je NE. To pomeni
Koda, ki upravlja zgornji vrstni red, dejansko ne deluje kot ključavnica.
Pravzaprav obstajata dve vrsti primerjav nizov, glej kodo:
Prva vrstica zgornje kode izpiše True, druga vrstica pa False. Verjamem, da razumeš, kaj MSDN pomeni z "istim nizom" brez moje razlage.
Najboljša rešitev
Rešitve za optimalne zaklepne vrvice:
Demo koda:
Na spletni strani se včasih uporabi globalna spremenljivka, ta globalna spremenljivka, ko več uporabnikov dostopa hkrati, lahko deluje nenavadno; takrat nastavimo globalno zaklepanje, vendar je slabost, da vsi dostopi čakajo zapored.
V nekaterih primerih, na primer, lahko isti uporabnik komentira le enkrat v 15 sekundah; če se uporabi globalno zaklepanje, bo funkcija komentarja zelo počasna pri obdelavi, ko se število uporabnikov poveča, kar močno vpliva na uporabniško izkušnjo.
V tem trenutku,Za vsakega uporabnika lahko nastavimo zaklep posebej, zaklep(niz){...}, ime ključavnice pa lahko definiramo kot:Ime metode + uporabniški IDNa ta način ima vsak uporabnik neodvisno zaklepanje, in pri ocenjevanju intervala komentarjev to ne vpliva na komentarje drugih uporabnikov.
(Konec)
|