これを読んだ後- 「同期」とはどういう意味ですか?スレッドセーフな環境でStringBufferがStringBuilderよりも遅い理由をまだ理解できませんでした。StringBufferを遅くするために、どのような余分な時間のかかる作業を行う必要がありますか?
3 に答える
競合していないロックを取得および解放するための小さなオーバーヘッドがあり、インスタンスがクロススレッドで使用されている可能性があるため、ほとんどのインスタンスがクロススレッドで使用されていない場合でも、ロックの省略は機能しません。StringBuffer
ロックを取得および解放するときにVMが実行する必要があることの説明については、http://book.javanb.com/java-threads-3rd/jthreads3-CHP-5-SECT-1.htmlを参照してください。
物事が同期して実行されていることを確認します。または、もっと要点を言えば、同期がとれていません。メソッド呼び出しを同期するということは、そのメソッドの2つの異なる呼び出し(静的でない場合はそのオブジェクト上で)が交互にメソッドに入る必要があることを意味します。スレッドA(すでにメソッド内にある)が終了するまで、スレッドBはメソッドsynchMethに入ることができません。
同期されたブロックがロックされているかどうか、および誰によってロックされているかを確認するには、余分な時間がかかります。
JavaDocからこれを読む
StringBuilderクラスは、StringBufferと互換性のあるAPIを提供しますが、同期の保証はありません。このクラスは、文字列バッファが単一のスレッドによって使用されていた場所でのStringBufferのドロップイン置換として使用するように設計されています(一般的にそうであるように)。可能であれば、ほとんどの実装で高速になるため、このクラスをStringBufferよりも優先して使用することをお勧めします。
StringBufferとStringBuilderのパフォーマンスの比較に関するこの記事を読む必要があります
リリースJDK5の時点で、このクラスには、単一のスレッド{StringBuilder}で使用するために設計された同等のクラスが追加されています。StringBuilderクラスは、同じ操作をすべてサポートするため、通常はこれよりも優先して使用する必要がありますが、同期を実行しないため、より高速です。
追加の便利なリンク:StringBufferクラスとStringBuilderクラスの違い。