0

私が書いたいくつかのjarを使用するWebアプリがあります。私の課題は、コードに重要な (しかし高速な) セクションがあることです。

static1 - いくつかのフィールドを持つ特定のクラスのオブジェクトがあります。これをクラスAとしましょう

2 _ A は、フィールドにアクセスする非静的メソッドを公開しstaticます。読み書き用。このメソッドを呼び出しましょうdoJob

3 - すべてのリクエストは、クラスのオブジェクトをインスタンス化し、Aを呼び出しますdoJob
A a = new A(); a.doJob();

Thread4 - すべてのリクエストが実行される新しい場所を作成していると仮定しdoJobます。

5 - 一度に1 つだけ定義するdoJobと、メソッドが実行され、他のメソッドは待機し続けます。public synchronized void doJob () {//Do the job}Thread

問題は、私の言っていることは大丈夫ですか?

4

4 に答える 4

1

その通りですが、doJobはインスタンスレベルで同期されるため、doJobメソッドは、クラスAの2つ以上のインスタンス上の2つ以上の異なるスレッドによって同時に実行される可能性があります。時間(たとえば、静的フィールドを変更するため)は、静的として宣言するか、静的フィールドをロックオブジェクトとして使用してメソッド本体全体を同期する必要があります。

于 2012-05-30T22:32:43.963 に答える
0

非静的(つまり、オブジェクトごとに1つ)モニターで静的(つまり、クラスごとに1つ)フィールドを保護しようとしている場合、「一度に1つのスレッドのみがメソッドを実行し、他のスレッドは保持します。待機中」の主張は成り立たない。

于 2012-05-30T22:32:26.640 に答える
0

いいえ。

インスタンスメソッドをとしてマークするsynchronizedことは、

public void myMethod() {
  synchronized(this) {
    ...
  }
}

したがって、2つのスレッドが同じオブジェクトの同じメソッドを実行していないことを保証することしかできません。別のオブジェクトの同じメソッドを同時に実行できます。

より「静的な」オブジェクトと同期してみてください。クラスオブジェクト自体、または静的な(そして不変の)メンバーを使用します。

于 2012-05-30T22:32:49.077 に答える
0

はい、アウトラインは正しいです。また、他のスレッドがアクセスを待機している間、技術的にシステムのボトルネックになります。これは、同期ブロック内に重い処理や I/O を配置しない限り、問題なく正常です。

于 2012-05-30T22:45:26.043 に答える