0

dopost/doget のいずれかによって呼び出されるサーブレット メソッド内の友人は、次のようなコードを持っています。

synchronized (this) 
{
String filePath="E:\\FSPATH1\\2KL06CS048\\";
System.out.println("Directory Created   ????????????"+new File(filePath).mkdir());
}

上記のサーブレットの複数のスレッドが一度に上記のコード ブロックに入ることができるかどうか??

しかし、サーブレットのライフサイクルの概念では、サーブレットのインスタンスは 1 つしかなく、そのサーブレットの各リクエストに対して、そのインスタンスで 1 つのスレッドが作成されると述べています。

実際、私の要件は

  1. リクエストを作成します(サーブレット呼び出しとこのサーブレットのジョブはサーバーにディレクトリを作成しています)
  2. サーブレット呼び出しから戻ったら、作成したディレクトリの名前を変更しています。
  3. 名前を変更している間、別のスレッドが同じディレクトリを作成してディレクトリの内容を変更してはなりません。このため、サーブレットのコードの種類を同期したい
4

3 に答える 3

1

Q. dopost / dogetのいずれかによって呼び出されるサーブレットメソッド内で、次のようなコードがあります。synchronized (this) {}

--->サーブレットコンテナ(tomcat)はリクエストごとにスレッドを作成するため、メソッドに含めるたびに、doGet() and doPost()それぞれのスレッドに対してローカルになります。したがって、再度同期する必要はありませんthis。だからあなたの考えは完全に間違っています。

于 2013-01-09T12:47:26.443 に答える
1

synchronized囲まれたブロックを一度に 1 つのスレッドだけが実行できるようにします。

さらにいくつかのポイント:

  1. synchronized キーワードは、メソッドまたはステートメント ブロックに適用でき、一度に 1 つのスレッドだけが実行する必要があるクリティカル セクションを保護します。

  2. synchronized キーワードは、コードのクリティカル セクションが一度に複数のスレッドによって実行されるのを防ぎます。

  3. 静的メソッドに適用すると、メソッドが一度に 1 つのスレッドによって実行されている間、クラス全体がロックされます。

  4. インスタンス メソッドに適用すると、一度に 1 つのスレッドがアクセスしている間、インスタンスはロックされます。

  5. オブジェクトまたは配列に適用すると、関連するコード ブロックが一度に 1 つのスレッドによって実行されている間、オブジェクトまたは配列がロックされます。

すべてのステートメントが一度に1 つのスレッドで終了することを確認してください。

于 2013-01-09T11:13:05.897 に答える
0

Yes, your code will ensure that only one thread can enter the block.

于 2013-01-09T11:42:25.640 に答える