この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 193519|答える: 11

[出典] .net/c# ユーザーマルチスレッド同時実行ロック(string){...}詳解

[リンクをコピー]
掲載地 2019/07/03 15:25:19 | | | |
よくある誤用シナリオ:ユーザーが誤って支払いボタンを複数回クリックして注文の重複支払いを防ぐため、ロック(注文番号)を使って、注文に対して操作を行えるスレッドは1つだけにしています。

この考え方は良いもので、少なくともロック(処理クラス用のプライベート静的オブジェクト)よりは良いです。なぜなら、命令番号をロックすることで現在の1の命令の操作だけをロックし、すべての命令をロックする静的変数をロックすると、すべての命令がキューに入ることになり、これは明らかに合理的ではありません。

では、この記事の冒頭で述べたロック(注文番号)方式は望ましい効果を達成できるのでしょうか? まずは使用状況を復元するためにコードを使おう。

ユーザー情報やその他の検証を無視すると、コードはほぼ次のようになります:
lockキーワードについては、MSDNにはBaiduで見つかる情報が含まれており、lock(string)の使用は推奨されていないようですが、その理由も同じです。 以下の一節はMSDNのロックストリングに関する助言から抜粋しています。

lock("myLock")の問題は、プロセス内で同じ文字列を使用する他のコードが同じロックを共有するために発生します。
この文には巨大な仕組み、すなわち「同じ弦」が隠されています。

「同じ弦」とは何でしょうか? コードをご覧ください:


STR1とSTR2は上の同じ文字列ですか? 答えはイエスです。

もう一度ご覧ください:


str1とstr2は同じ弦ですか? 答えはノーです。

では、注文支払いの問題に戻りましょう。 私たちのコード、lock(orderNumber)では、ユーザーが誤って手をスワイプした後にさらに数回クリックしたとき、orderNumberは毎回同じ文字列でこのアクションを入力しているのでしょうか? 答えはノーです。 つまり、

上記の順序を処理するコードは実際にはロックとして機能しません。

実際、文字列比較には2種類あり、コードを参照してください。


上記のコードの最初の行はTrue、2行目はFalseを出力します。 私の説明なしでもMSDNの「同じ文字列」の意味は理解していると思います。

最善の解決策

最適なロック弦の解決策:





デモコード:




ウェブサイトでは、グローバル変数が使われることがあり、複数のユーザーが同時にアクセスすると異常に見えることがあります。この時点でグローバルロックを設定しますが、その欠点はすべてのアクセスが順番に待機してしまうことです。

例えば、同じユーザーが15秒以内に一度しかコメントできない場合、グローバルロックを使用すると、ユーザー数が急増するとコメント機能の処理が非常に遅くなり、ユーザー体験に大きな影響を与えます。

この時点で、各ユーザーごとにロックを設定できます。lock(string){...} で、ロック名は次のように定義できます:メソッド名 + ユーザーIDこのようにして、各ユーザーは独立したロックを持ち、コメント間隔を判断しても他のユーザーのコメントには影響しません。

(終わり)




先の:MFCのLPSTRタイプライティング
次に:OpenSSLは明らかにアップデートされていますが、Apacheはまだ古いバージョンを表示しますか?
掲載地 2022/05/13 14:27:17 |
では、この記事の冒頭で述べたロック(注文番号)方式は望ましい効果を達成できるのでしょうか? まずは使用状況を復元するためにコードを使おう。
 地主| 掲載地 2023/08/12 19:48:15 |
.NET/C# ロック原理モニターは詳細な説明を提供します
https://www.itsvse.com/thread-9633-1-1.html
掲載地 2023/01/07 11:22:02 |
私も仕事の現場でこの問題に遭遇しました。この技術記事の著者に感謝します
掲載地 2019/07/03 20:02:32 |
これは良い話です
掲載地 2021/06/18 14:24:43 |
ページに示されているのは、コードが閲覧できないということです
掲載地 2021/06/29 0:21:16 |
コードを見てみろ
掲載地 2021/06/29 0:54:24 |
コードが見えない
掲載地 2022/05/14 10:06:46 |
学ぶために
掲載地 2022/05/28 22:03:59 |
とても良い、学んだ
掲載地 2022/11/28 21:46:47 |
asp.net 使えますか?
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com