Чести сценарии на злоупотреба: За да предотвратим дублиране на плащане на поръчки, причинено от случайно натискане на бутона за плащане от потребители, използваме заключване (номер на поръчка), за да гарантираме, че само една нишка може да извърши операцията върху поръчката.
Тази идея е добра, поне по-добра от заключването (частен статичен обект за обработка на класове), защото ефектът от заключването на номера на поръчката е да заключи само операцията на текущия 1 ред, а ако заключва статичната променлива, тоест заключва всички поръчки, ще доведе до поставяне на опашка за всички поръчки, което очевидно е неразумно.
Може ли методът на заключване (номер на поръчка), споменат в началото на тази статия, да постигне желания ефект? Нека първо използваме малко код, за да възстановим сценария на използване.
Ако игнорирате потребителската информация и други валидации, кодът изглежда почти така:
За ключовата дума lock MSDN включва информация, която може да се намери в Baidu, и изглежда, че се препоръчва да не се използва lock(string), като причината е същата. Следният откъс е взет от съветите на MSDN относно заключващите струни:
Проблемът с заключването ("myLock") възниква, защото всеки друг код, използващ същия низ в процеса, ще споделя същия катинар. Това изречение крие огромен механизъм, а именно "същата нишка".
Какво е "същата струна"? Вижте кода:
Str1 и str2 ли са една и съща струна по-горе? Отговорът е ДА.
Вижте отново:
Str1 и str2 по-горе все още ли са една и съща струна? Отговорът е не.
Добре, нека се върнем към въпроса с плащането на поръчката. В нашия код, lock(orderNumber), когато потребителят случайно кликне още няколко пъти след като е плъзгал ръката си, дали orderNumber, който въвежда това действие, е един и същ низ всеки път? Отговорът е не. Тоест
Кодът, който обработва горната заповед, всъщност не действа като заключване.
Всъщност има два вида сравнения на низове, вижте кода:
Първият ред от горния код извежда True, а вторият ред – False. Мисля, че разбирате какво има предвид MSDN под "същата струна" без моето обяснение.
Най-доброто решение
Решения за оптимални заключващи струни:
Демо код:
В уебсайта понякога може да се използва глобална променлива, тази глобална променлива, когато няколко потребители имат достъп едновременно, може да изглежда необичайна, в този момент ще зададем глобална заключваща система, но недостатъкът е, че всички достъпи ще изчакат последователно.
В някои ситуации, например, един и същ потребител може да коментира само веднъж в рамките на 15 секунди; ако се използва глобалната заключваща система, функцията за коментари ще бъде много бавна за обработка, когато броят на потребителите се увеличи, което значително ще повлияе на потребителското изживяване.
В този момент,Можем да зададем заключването за всеки потребител поотделно, lock(string){...}, а името на заключването може да се дефинира като:Име на метод + потребителски идентификаторПо този начин всеки потребител има независима заключваща връзка, и при оценка на интервала за коментари това няма да влияе на коментарите на другите потребители.
(Край)
|