Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 193519|Ответ: 11

[Источник] .net/c# Пользовательский многопоточный concurrency lock(string){...} Подробное объяснение

[Скопировать ссылку]
Опубликовано 03.07.2019 15:25:19 | | | |
Распространённые ситуации неправильного использования: чтобы предотвратить дублирование оплаты заказов, вызванное случайными нажатием кнопки оплаты пользователями несколько раз, мы используем блокировку (номер заказа), чтобы гарантировать, что операцию выполняет только один поток.

Эта идея хороша, по крайней мере лучше, чем блокировка (частный статический объект для классов обработки), потому что эффект блокировки номера ордера заключается в блокировке только операции текущего порядка 1, а если блокировать статическую переменную, то есть блокировать все приказы, то есть все приказы будут поставлены в очередь, что, очевидно, неразумно.

Так может ли метод замка (номер заказа), упомянутый в начале этой статьи, достичь желаемого эффекта? Давайте сначала восстановим сценарий использования.

Если игнорировать пользовательскую информацию и другие валидации, код выглядит примерно так:
Для ключевого слова lock MSDN включает информацию, которую можно найти на Baidu, и, похоже, рекомендуется не использовать lock(string), причина та же. Следующий отрывок взят из рекомендаций MSDN по замковым струнам:

Проблема с блокировкой («myLock») возникает потому, что любой другой код, использующий ту же строку в процессе, будет иметь тот же блокировочный блок.
Это предложение скрывает огромный механизм, то есть «та же нить».

Что такое «одна и та же нить»? См. код:


Str1 и str2 — это одна и та же строка, описанная выше? Ответ — ДА.

Смотрите ещё раз:


Str1 и str2 выше всё ещё одинаковые струны? Мой ответ – нет.

Ладно, вернёмся к вопросу оплаты заказа. В нашем коде, lock(orderNumber), когда пользователь случайно нажимает ещё несколько раз после свайпа, вводится ли orderNumber в одну и ту же строку каждый раз? Мой ответ – нет. То есть

Код, который обрабатывает приведённый выше приказ, фактически не является блокировкой.

На самом деле существует два типа сравнений строк, см. код:


Первая строка вышеуказанного кода выводит True, а вторая строка — False. Полагаю, вы понимаете, что MSDN имеет в виду под «одной и той же строкой» без моих объяснений.

Лучшее решение

Решения для оптимальных блокирующих строк:





Демо-код:




На сайте иногда используется глобальная переменная, которая при одновременном доступе нескольких пользователей может показаться ненормальной, в этот момент мы устанавливаем глобальную блокировку, но недостаток в том, что все доступы будут ждать по очереди.

В некоторых случаях, например, один и тот же пользователь может оставить комментарий только один раз в течение 15 секунд, а при использовании глобального блокировки функция комментариев будет очень медленно обрабатываться при резком росте числа пользователей, что сильно влияет на пользовательский опыт.

В это время,Мы можем установить блокировку для каждого пользователя отдельно, lock(string){...}, и имя замка можно определить следующим образом:Имя метода + идентификатор пользователяТаким образом, у каждого пользователя есть независимая блокировка, и при оценке интервала комментариев это не влияет на комментарии других пользователей.

(Конец)




Предыдущий:Текст LPSTR от MFC
Следующий:OpenSSL явно обновился, Apache всё ещё подсказывает старую версию?
Опубликовано 13.05.2022 14:27:17 |
Так может ли метод замка (номер заказа), упомянутый в начале этой статьи, достичь желаемого эффекта? Давайте сначала восстановим сценарий использования.
 Хозяин| Опубликовано 12.08.2023 19:48:15 |
.NET/C# Lock Principle Monitor даёт подробное объяснение
https://www.itsvse.com/thread-9633-1-1.html
Опубликовано 07.01.2023 11:22:02 |
Я также столкнулся с этим в своей рабочей практике, спасибо автору за эту техническую статью
Опубликовано 03.07.2019 20:02:32 |
Это отличная вещь
Опубликовано 18.06.2021 14:24:43 |
На странице показано, что код нельзя просмотреть
Опубликовано 29.06.2021 0:21:16 |
Посмотри на код
Опубликовано 29.06.2021 0:54:24 |
Я не вижу кода
Опубликовано 14.05.2022 10:06:46 |
Учитесь учиться
Опубликовано 28.05.2022 22:03:59 |
Очень хорошо, научился
Опубликовано 28.11.2022 21:46:47 |
Можно ли asp.net использовать?
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com