0

を使用synchronizedしている場合、同期されるオブジェクトは である必要がありますstaticか?

編集: オブジェクトへの参照は静的でなければならないと言うつもりでした。私が読んでいた例の 1 つに、スレッドがクラス A で同期メソッドを使用するには、クラス A への参照が静的でなければならないことが記載されていることに気付きました。

それで、同期メソッドを呼び出すすべてのスレッドがインスタンスの同じコピーを使用するように、オブジェクトへの参照を静的にするのがルールなのかどうか疑問に思っていました。この例では、同期メソッドを使用して 1 から 10 までカウントします。したがって、この同期メソッドにアクセスする各スレッドは、それぞれ 1 から 10 をカウントする必要があります。静的なしでこれを試したところ、結果が正しくありませんでした。

4

5 に答える 5

1

オブジェクトを静的または非静的にすることはできません。この属性は変数にのみ適用されます。すべてのオブジェクトは、「ルート」からの参照を通じて到達できなくなるまで、ヒープ上で等しく生きています。

同期には、オブジェクト自体 (参照を保持する変数ではない) が必要なので、それらのオブジェクトへの参照が静的変数、非静的変数、またはローカル変数によって保持されていても違いはありません。

于 2012-08-13T04:19:30.230 に答える
1

それ static または non-staticではなくobject状態が同時実行の問題から保護されているデータです。

1.は、 2 つ以上のスレッドが同じオブジェクトにアクセスするsynchronized場合に使用されるキーワードです。

2.同期とは、重要なデータの状態を保護することです。

3.すべてobjectに があるため、 であるデータLock and a Keyを保護するために、が使用されます。 instance variableobject's key

4.同様に、つまり (Class Data)State of the Dataを保護するために使用されます。staticclass's key

于 2012-08-13T04:22:32.993 に答える
1

これを過度に矮小化するリスクがあります:

  1. コードを調べて、リソースのセット、または同時スレッドで実行されるコードによってアクセスされるデータを特定します。 考慮すべきコードは、複数のメソッド (場合によってはクラス) にまたがる場合があります。

  2. 一般に、一連のリソースを代表するもので同期します。

    • リソースのセットがすべてオブジェクト インスタンス データ (非静的) である場合、データを所有するオブジェクトで同期することは許容されます。 (そのオブジェクトが「これ」でない場合は、自分自身に多くの質問をしてください!)。

    • リソース セットのいずれかの部分が静的クラス データである場合、静的データを表す何かを同期する必要があります。これはそれ自体かもしれませんclass。(プリミティブ値はオブジェクトではないことも知っています)。

    • 特定のリソースのセットに対して常に同じものをロックします。これにより、同じリソースのセットを 求めて競合するスレッドが互いに適切に調整されます。

  3. そのようなリソースのセットを2 つ検討している場合、両方のセットに属する項目が 1 つもあってはなりません。 その場合、それらは 1 つのリソースのセットになる必要があります。

  4. (1) で特定された一連のリソースから競合しない(読み取りまたは書き込み) メソッドが同じオブジェクト内にある場合、そのメソッドを同期する必要はありません。ただし、メソッドが同時に使用される場合は、次のことを考慮してください。

    • そのようなメソッドが別のリソースのセットからデータにアクセスする場合は、そのセットに同期する必要があります。

    • (3) を参照してください。

これを読んで、sychronizedキーワードが静的メソッドとインスタンス メソッドでどのように機能するかを理解してください

于 2012-08-13T05:42:43.983 に答える
0

必ずしも。

Web アプリを構築していて (たとえば)、各クライアント セッションがセッションに固有のオブジェクトのリスト (たとえば、各ユーザーの書籍のリスト) で作業している場合、スレッドが書籍のリストを読み込んでも問題ありません。私のスレッドは本のリストを更新しています。

于 2012-08-13T03:22:58.630 に答える
0

オブジェクトを同期しません。synchronized一度に 1 つのスレッドのみがそのブロックを通過できるように、コードのブロック(ブロック内のメソッドまたはコードである可能性があります) を同期します。Object はロックを提供します。これは、スレッドがそのコード ブロックを既に実行している場合に、他のスレッドがそのコード ブロックに入るのを防ぐために使用されます。オブジェクトへの参照がstaticスレッド同期に関するものであるかどうかは問題ではありませんが、静的メソッド内で非静的変数を使用できないことにも注意してください。

于 2012-08-13T04:54:39.397 に答える