Gyakori visszaélési esetek: Annak érdekében, hogy megakadályozzuk a rendelések duplikált kifizetését, amelyet a felhasználók véletlenül többször is megnyomnak a fizetési gombra, lock (rendelésszám) segítségével biztosítjuk, hogy csak egy szál hajtsa végre a műveletet a rendelésen.
Ez az ötlet jó, legalábbis jobb, mint a lock (egy privát statikus objektum az osztályok feldolgozásához), mert a rendelésszám zárolása csak az aktuális 1 rend műveletét zárja, és ha a statikus változó zárolása, vagyis az összes rendelés zárolása, akkor minden rendelés sorba kerül, ami nyilvánvalóan ésszerűtlen.
Tehát a cikk elején említett zárolási (rendelésszám) módszer elérheti-e a kívánt hatást? Használjunk először egy kis kódot a használati helyzet visszaállításához.
Ha figyelmen kívül hagyod a felhasználói információkat és egyéb ellenőrzéseket, a kód nagyjából így néz ki:
A zár kulcsszó esetén az MSDN olyan információkat tartalmaz, amelyek a Baidu-n találhatók, és úgy tűnik, hogy ajánlott nem használni a lock(string) kifejezést, az ok pedig ugyanaz. A következő rész az MSDN zárhúrokkal kapcsolatos tanácsából származik:
A lock("myLock") probléma azért alakul ki, mert bármely más kód, amely ugyanazt a stringet használja a folyamatban, ugyanazt a zárat osztja meg. Ez a mondat egy hatalmas mechanizmust rejt, vagyis "ugyanazt a zsinórt".
Mi az a "ugyanaz a húr"? Lásd a kódot:
Az 1. és 2. és a 2. húr ugyanaz a felsőbb szereplő? A válasz IGEN.
Lásd újra:
Az 1. és 2. szúró fölött még mindig ugyanaz a húr? A válasz: NEM.
Rendben, térjünk vissza a rendelés kifizetésének kérdéséhez. A mi kódunkban, a lock(orderNumber), amikor a felhasználó véletlenül még néhányszor kattint a keze húzása után, vajon a orderNumber minden alkalommal ugyanazt a stringet írja? A válasz: NEM. Ez azt jelenti, hogy
A fenti sorrendet kezelő kód valójában nem működik zárként.
Valójában kétféle string-összehasonlítás létezik, lásd a kódot:
A fenti kód első sora True-t, a második sor pedig False-t ad. Úgy hiszem, érted, mit ért az MSDN az "ugyanazzal a zsinórral" anélkül, hogy magyaráztam volna.
A legjobb megoldás
Optimális zároló húrok megoldásai:
Demográfiai kód:
A weboldalon néha globális változót is használnak, ez a globális változó, amikor több felhasználó egyszerre ér hozzáférést, rendellenesnek tűnhet, ekkor globális zárolást állítunk be, de ennek hátránya, hogy minden hozzáférés sorra vár.
Bizonyos helyzetekben, például ugyanaz a felhasználó csak egyszer tud kommentelni 15 másodpercen belül, ha a globális zárolást használják, a komment funkció nagyon lassan feldolgozza, amikor a felhasználók száma megugrik, ami jelentősen befolyásolja a felhasználói élményt.
Ebben az időszakban,A zárat minden felhasználónak külön-külön állíthatjuk be, lock(string){...}, és a zár neve így definiálható:Metót név + felhasználói azonosítóÍgy minden felhasználónak független zárolása van, és a hozzászólásintervallum értékelése nem befolyásolja más felhasználók hozzászólásait.
(Vége)
|