Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 193519|Odpověď: 11

[Zdroj] .net/c# Uživatelský vícevláknový souběžný zámek(string){...} Podrobné vysvětlení

[Kopírovat odkaz]
Zveřejněno 03.07.2019 15:25:19 | | | |
Běžné scénáře zneužití: Abychom zabránili duplicitním platbám objednávek způsobeným uživatelem, kteří omylem kliknou na tlačítko platby opakovaně, používáme zámek (číslo objednávky), abychom zajistili, že operace na objednávku může provést pouze jedno vlákno.

Tato myšlenka je dobrá, alespoň lepší než zámok (soukromý statický objekt pro zpracování tříd), protože efektem uzamčení čísla příkazu je uzamknout pouze operaci aktuálního řádu 1, a pokud uzamkne statickou proměnnou, tedy uzamkne všechny příkazy, způsobí, že všechny příkazy budou zařazeny do fronty, což je zjevně nerozumné.

Může tedy metoda zámku (číslo objednávky) zmíněná na začátku tohoto článku dosáhnout požadovaného efektu? Nejprve použijme kód k obnovení scénáře používání.

Pokud ignorujete uživatelské informace a další ověření, kód vypadá přibližně takto:
Pro klíčové slovo lock MSDN obsahuje informace, které lze najít na Baidu, a zdá se, že se nedoporučuje používat lock(string), přičemž důvod je stejný. Následující pasáž je převzata z rady MSDN ohledně zámkových řetězců:

Problém se zámkem ("myLock") nastává proto, že jakýkoli jiný kód používající stejný řetězec v procesu bude sdílet stejný zámek.
Tato věta skrývá obrovský mechanismus, tedy "stejný řetězec".

Co je to "stejný řetězec"? Viz kód:


Jsou str1 a str2 stejná struna výše? Odpověď je ANO.

Podívejte se znovu:


Jsou str1 a str2 nad hlavou stále stejná struna? Odpověď je NE.

Dobře, vraťme se k otázce platby objednávky. V našem kódu lock(orderNumber), když uživatel omylem klikne několikrát po přejetí ruky, je orderNumber při zadávání této akce pokaždé stejný řetězec? Odpověď je NE. To znamená

Kód, který spravuje výše uvedené pořadí, ve skutečnosti nefunguje jako zámek.

Ve skutečnosti existují dva typy porovnání řetězců, viz kód:


První řádek výše uvedeného kódu vypíše True a druhý řádek False. Myslím, že chápeš, co MSDN myslí "stejný řetězec" bez mého vysvětlení.

Nejlepší řešení

Řešení pro optimální uzamykatelné řetězce:





Demo kód:




Na webu může být někdy použita globální proměnná, tato globální proměnná, když přistupuje více uživatelů současně, může vypadat abnormálně, v tuto chvíli nastavíme globální zámek, ale nevýhodou je, že všechny přístupy budou čekat postupně.

V některých případech může například stejný uživatel komentovat pouze jednou během 15 sekund, pokud je použit globální zámek, funkce komentářů bude velmi pomalá na zpracování, když počet uživatelů prudce vzroste, což výrazně ovlivní uživatelský zážitek.

V tuto chvíli,Můžeme nastavit zámek pro každého uživatele zvlášť, lock(string){...}, a název zámku lze definovat jako:Jméno metody + uživatelské IDTímto způsobem má každý uživatel nezávislý zámek a při hodnocení intervalu komentářů to neovlivní komentáře ostatních uživatelů.

(Konec)




Předchozí:MFC psaní na LPSTR
Další:OpenSSL byl očividně aktualizován, Apache stále vyvolává starou verzi?
Zveřejněno 13.05.2022 14:27:17 |
Může tedy metoda zámku (číslo objednávky) zmíněná na začátku tohoto článku dosáhnout požadovaného efektu? Nejprve použijme kód k obnovení scénáře používání.
 Pronajímatel| Zveřejněno 12.08.2023 19:48:15 |
.NET/C# Monitor principů zámků poskytuje podrobné vysvětlení
https://www.itsvse.com/thread-9633-1-1.html
Zveřejněno 07.01.2023 11:22:02 |
Setkal jsem se s tím i ve své pracovní praxi, díky autorovi za tento technický článek
Zveřejněno 03.07.2019 20:02:32 |
To je dobrá věc
Zveřejněno 18.06.2021 14:24:43 |
Na stránce je uvedeno, že kód nelze zobrazit
Zveřejněno 29.06.2021 0:21:16 |
Podívej se na kód
Zveřejněno 29.06.2021 0:54:24 |
Nevidím ten kód
Zveřejněno 14.05.2022 10:06:46 |
Učte se učit
Zveřejněno 28.05.2022 22:03:59 |
Velmi dobře, učenec
Zveřejněno 28.11.2022 21:46:47 |
Lze asp.net použít?
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com