7

たくさんのスレッドを読み取り、いくつかのスレッドを書き込んでいるプリミティブ型の変数を考えてみましょう。次のコードは正しく機能しますか?

もしそうなら、それは1)よりも優れたパフォーマンスを提供しますか?すべてのメソッドで同期を宣言します。2)。明示的なReadWriteLockを使用していますか?

これは一般的なパターンですか?そうでない場合、この状況では通常どのようなパターンが使用されますか?

これは現在私にとっては問題なく機能しますが、揮発性と同期の両方を使用するのは少し冗長だと思います。

private volatile int value = 1;

public void func1()
{
    if (value == 1) {
        // do something
    }
}

public void func2()
{
    if (value == 2) {
        // do something
    }
}

public void func3()
{
    if (value == 3) {
        // do something
    }
}

public synchronized void increase()
{
    if (value < 10) value++;
}

public synchronized void decrease()
{
    if (value > 0) value--;
}
4

3 に答える 3

6

はい、少なくともある程度は一般的です:)

使用しているパターンは、このIBMの記事-> http://www.ibm.com/developerworks/java/library/j-jtp06197/index.htmlで説明されています。

(パターン#5、安価な読み取り/書き込みロックトリック)

于 2012-06-16T10:54:12.717 に答える
3

たくさんのスレッドを読み取り、いくつかのスレッドを書き込んでいるプリミティブ型の変数を考えてみましょう。次のコードは正しく機能しますか?

そう思います。

もしそうなら、それは1)よりも優れたパフォーマンスを提供しますか?すべてのメソッドで同期を宣言します。2)。明示的なReadWriteLockを使用していますか?

読み取り操作が書き込み要求を上回っていれば、そう思います。でも:

  • このカウンターが非常に争われていない限り、それはおそらく問題ではありません。ボトルネックである(またはボトルネックになる)という証拠がない限り、何かをマイクロ最適化することに時間を無駄にしないでください。
  • それが本当にあなたにとって重要であるならば、それをベンチマークしてください。
  • 相対的なパフォーマンスがJVMのバージョン/パッチレベル、JVMオプション、およびハードウェアに依存する場合でも驚かないでください。たとえば、プロセッサの数とメモリアーキテクチャ。

これは一般的なパターンですか?そうでない場合、この状況では通常どのようなパターンが使用されますか?

これが一般的かどうかはわかりません。しかし、私の直感では、最も一般的なアプローチは、定期的な同期を使用することであり、それについて心配する必要はありません。非常に競合するデータ構造を扱っている場合を除いて、さまざまなアプローチ間のパフォーマンスの違いは、アプリケーション全体のパフォーマンスにとって重要ではありません。

于 2010-11-27T03:35:58.253 に答える
0

ロックがないため、パフォーマンスが向上すると確信していますが、正しいかどうかはコードの意図によって異なります。確かに、動作は同期された場合とは異なります。動作がロックケースに似ているかどうかは、ロックする場所によって異なります。

于 2010-11-27T02:43:31.383 に答える