5

私はここでこの主題について多くの議論を見てきました.

データベースまたはサーバーに接続する静的メソッドを備えた静的クラスがある場合、これをマルチユーザー環境 (Web ページなど) で使用するのは悪い考えですか? これにより、新しいユーザーのトレッドは、新しいユーザーを受け入れる前に、以前のユーザーのスレッドが呼び出しを終了するのを待つようになりますか?

また、マルチスレッドでこれが意味することは何でしょうか?

どうも!

4

8 に答える 8

6

各静的メソッドがそのリソースを取得し、メソッド呼び出しのスコープ内でそのリソースを破棄する責任を完全に負っている場合 (共有状態なし)、インスタンス クラスを使用しないスレッド化の問題は発生しません。ただし、より大きな問題は、(静的クラスまたは非静的クラスの) public static メソッドへの依存が、将来的に他の多くの設計上の問題を引き起こすことです。

  • まず第一に、実装に非常に緊密にバインドしていますが、これは常に悪いことです。
  • 第 2 に、静的メソッドに依存するすべてのクラスをテストすることは非常に困難になります。これは、単一の実装に縛られているためです。
  • 第 3 に、静的メソッドは静的な状態 (すべてのメソッド呼び出しで共有される) しか持てないため、非スレッド セーフなメソッドを作成するのが非常に簡単になります。
于 2009-04-23T13:38:05.733 に答える
3

静的メソッドには、マルチスレッドに関して特別な動作はありません。つまり、メソッドの複数の「コピー」が同時に実行されることが期待できます。同じことが静的変数にも当てはまります。異なるスレッドが一度にすべてにアクセスでき、そこで待機することはありません。注意しないと、混乱が生じる可能性があります。

于 2009-04-23T13:39:39.940 に答える
1

はい、それは悪い考えです。

すべてのユーザーに対して 1 つの接続を使用する場合、誰かが必要なアクションを実行した場合、たとえば 15 秒をデータベース アクセスに使用すると、他のすべてのユーザーはデータベースに接続するために待機する必要があります。

于 2009-04-23T13:40:24.807 に答える
0

ルックアップオブジェクトには静的メソッドを使用します。asp.netアプリケーションのすべてのルックアップオブジェクトを(キャッシュを使用して)1つの場所で管理でき、すべてのメソッドが静的メソッドを使用してそれを呼び出します。

このようにして、必要なたびにルックアップオブジェクトをインスタンス化する必要がなくなり、パフォーマンスを向上させるためにDBを呼び出す必要がなくなります。

于 2009-04-23T14:33:16.567 に答える
0

この質問で少し奇妙になりました。なぜそんなに多くの静電気が起こっているのかについて。

しかし、あなたはスレッド化の問題について尋ねていると思うので、スレッド化に関するいくつかのドキュメントをチェックしてください

于 2009-04-23T13:38:04.063 に答える
0

静的は、メソッドが定義されているスコープと、それがどのようにバインド/呼び出されるかを定義するだけです。マルチスレッドとは関係ありません。

静的フィールドには注意が必要です。それらはすべてのスレッドで共有されます。スレッドは互いに待機していませんが、機能させるにはロックが必要です。

ただし、アプリケーションが Hello World よりも少し複雑な場合は、静的メソッドではなく、オブジェクト指向パターンを使用することを検討する必要があります。

于 2009-04-23T13:38:54.483 に答える
0

1 つの静的接続を使用してデータベースにアクセスする場合は、メソッド呼び出しを同期する必要があります。単一の接続を介してデータベースにデータを要求する複数のスレッドは... うーん...混乱します。したがって、すべてのスレッドのデータ アクセスをシリアル化しているため、パフォーマンスに大きな影響を与えます。

すべての呼び出しが独自の接続を開く場合、共有接続がないため、すべてのスレッドをシリアル化する必要はありません。リクエストごとに接続を作成することは、依然として高価な設計です。

静的接続プールを使用すると、接続プールへのアクセスをシリアル化するだけで済むため、このパフォーマンスへの影響が軽減されます。

さらに、静的は一般的に設計上適切な決定ではありません。静的は単体テストを非常に複雑にします。Singleton または Monostate パターンの使用を検討する必要があります。

于 2009-04-23T13:41:27.440 に答える
0

正しく行えば、問題はありません。間違えると、リソースへの強制順次アクセスが発生する可能性があります。

正誤の違いが非常に微妙で見つけにくい場合もありますが、主なことは、どのメソッドもクラスの「状態」(メンバー) に依存したりロックしたりしてはならないということです。

于 2009-04-23T13:41:46.347 に答える