2010-12-04 11 views
10

のコストと私の方法は、正しく書かれており、正しく同期されていると仮定は、私が優れているかを決定する方法について疑問に思って:の高いコンカレントJavaプログラムで同期

void synchronized something() { 
    ... 
} 

または

void something() { 
    synchronized(this) { 
     ... 
    } 
    // here do stuff no requiring synchronization 
    . 
    . // do computation 'A' 
    . 
    synchronized(this) { 
     ... 
    } 
    // here do other stuff no requiring synchronization 
    . 
    . // do computation 'B' 
    . 
    synchronized(this) { 
     ... 
    } 
} 

今私は、計算 'A'と 'B'に多くの時間がかかる場合、第2のバージョンが明らかに優れていることを認識しています。

私の質問は、次のとおりです。どの時点で、2番目のバージョンが効率的であることが分かりますか?

ロックを数回取得/解放する際、2番目のバージョンが常に高速ですか、隠れたコストがありますか?はい、​​は時間がかかり

s.getString().substring(0, 2).toLowerCase(); 
+0

私は* "Java Concurrency in Practice" *のコピーを所有していることに注意してください:) – SyntaxT3rr0r

答えて

8

:私の計算は '単にような些細な何かであればどのような

。実際の計算がシンプルでループ内にある場合は、ロットの時間が実際の計算と比較されます。

この例を参照してください:http://ideone.com/zgpB7

  • インナー部分は同期:約0.025sが
  • ループ全体が同期
  • :未満0.001s

あなたのプログラムのために優れているかを判断するために、聞かせてそれはものを実行し、より速いのを見ます。

+0

+1 ...私はかなりショックを受けています:)私は、目に会うものよりもそれ以上のものがあると確信していました:) – SyntaxT3rr0r

+5

この例が示すもう1つの点は、1,000,000回の同期化ロックが0.024秒かかることです。したがって、何百万回も反復しているか、またはスレッド間で可用なリソース競合が発生している場合を除き、同期そのものはそれほど遅くはありません。 (これらの例を実行したどのマシンでも、1回のロックにつき0.000000024秒が明らかです)。 – Gus

+1

私は大きな同期ブロックを使用することに最大のヒットは、同時性の損失だと思う。突然、あなたの複数のプロセッサが役に立たない。ロックを待っていない他のスレッドがある場合は、それほど悪くないかもしれません。 – Cruncher

2

thejhは、スレッドを繰り返しロックするには多少のコストがかかるという点をよくしています。しかし、私が並列スレッドに関する人々と話しているときは、常に同時に実行しているときにすべてのスレッドがすばやく実行されるようにすることが常に求められていました。

ロックを必要以上に長く保つと、他のスレッドが遅くなる可能性があります。彼らはあなたがしたい仕事に干渉しない仕事をしている間、座って待たなければなりません。これが実際にあなたにとって重要な状況である場合は、プロファイラを使用して、状況に応じて最適なものを確認する必要があります。マルチスレッド最適化は、一般的に成立する「ベストプラクティス」が存在する状況の1つですが、すべての状況で機能するルールを取得することはありません。それほど細かいことが必要な場合は、テストして見てください。

1

「正しく書き込まれました」と「正しく同期されていますか」とは、マルチシンクロケースのコードセクション間に依存関係がないことを意味しますか?依存関係がある場合、マルチシンクロナイズの場合、不変量に違反する可能性があります。別の言い方をすれば、マルチシンクロナイズされたケースの実行によって、あるオブジェクトが無効な状態にならないことを保証できますか?もしそうでなければ、単一同期化された場合が良いでしょう。

+0

ええ、それは保証されています。それは正確に私の質問の前提です:) IOW、あなたは純粋に理論的な質問として私の質問を見ることができます:) – SyntaxT3rr0r

+1

@SpoonBender:その場合、2つのソリューションの相対的なパフォーマンスは、利用可能なCPUの数に依存する可能性があります。 –

+0

@SteveEmmersonまたはスレッド数とCPU数の比の関数。 – Cruncher

関連する問題