0

この質問は、整数値で同期するとNullPointerException が発生することに基づいており、この質問から派生しています 整数値で同期する

Java でロック数を増やす最善の方法を知りたいと思っていました。ConcurrentHashMapつまり、固定配列に基づいて、キーのハッシュを計算して配列のインデックスを参照することによって実装されている以外はどれですか?

以下、予想です。1 つのオブジェクトが処理中の場合、同じオブジェクトが別のスレッドから呼び出された場合、同じオブジェクトに対してdoMoreThing()行うべきではありません。doAnotherThing()

public void doSomething(int i) {
    doAnotherThing(i);// some checks here based on it it will call to
                        // doMoreThing
    doMoreThing(i);
}
4

1 に答える 1

4

Java のすべてObjectには、関連付けられたロックがあります。新しいロックが必要な場合は、新しいObject. 参照されている質問では、ロックの数を増やそうとしている理由や、それが何を意味するのかが明確になりません。多分あなたはより多くの詳細を提供することができます。

変更された質問に従って更新

私はあなたが何を目指しているかを理解していると思います:事実上、あなたは渡されたsynchronizedブロックを必要としてintいます。doSomethingあなたがしたいことをするための2つの比較的簡単な方法があります:

a)複数のスレッドが異なるsを同時に呼び出すことができることは本当に重要ですか? そうでない場合は、両方の呼び出しをdoSomething intsynchronized(this)

b) ints は s ではありませんObjectdoSomethingを取得するように変更し、呼び出しているもの (およびそれを呼び出しているものなど) も s を使用するようにInteger変更すると、で同期できます。ここでは、すべての呼び出し元が同じオブジェクトを使用していることを確認することが重要です。同じ値を持つ s を複数持つことは可能ですが、異なる s で同期すると、探している保護が提供されません。doSomethingIntegerIntegerIntegerIntegerintInteger

于 2012-10-15T07:01:48.830 に答える