質問
私は本当に新しいJava、こ synchronized
は"非常に高価な"Java.すべての知りたいような高価などです。
感謝。
解決
これは、(あなたはそれが「非常に高価」であったことを読んで、なぜ可能性がある)ひどいことに使用されます。これらのミームが出て死ぬために長い時間がかかることがあります。
同期はどのように高価な並行プログラミングはまだ遅くすることができますが、それにはあまりないが、今、純粋にJavaの障害である -で?
のでキャッシュのフラッシュおよび無効化を含むルールの、Java言語での同期ブロックは、一般的に、通常、原子「のテストと設定されたビット」機械命令で実装されている多くのプラットフォームで提供されるクリティカルセクション施設、より高価です。プログラムは、単一のプロセッサ上で実行されている単一スレッドのみが含まれている場合でも、同期メソッド呼び出しは、まだ未同期メソッドの呼び出しよりも遅くなります。同期が実際にロックするために競合する必要がある場合に必要ないくつかのスレッドスイッチとシステムコールが存在するであろうように、性能ペナルティは、実質的に大きい。
幸いなことに、JVMの継続的な改善は、両方の全体的なJavaプログラムのパフォーマンスを改善し、各リリース同期の相対的なコストを低減し、将来の改善が期待されています。さらに、同期のパフォーマンスコストはしばしば誇張されています。 1つの周知のソースは、同期メソッド呼び出しが未同期メソッド呼び出しよりも最大50倍遅いことを引用しました。この文は本当かもしれないが、それはまた、非常に誤解を招くおそれがあり、それが必要とされている場合にも、同期を避けるために多くの開発者をリードしてきました。
と言いました。罰金と粗ロックの間のトレードオフがあります。あまりにも粗いが明らかに悪いですが、ロックが非ゼロのコストを持っているとして、それは、あまりにも細かすぎることが可能です。
これは、競合の下で特定のリソースを考慮することが重要です。機械的なハードディスクは、より多くのスレッドがの悪い方のパフォーマンスにつながる可能性の例です。
他のヒント
これは高価です
これは、ボトルネックのようなものです。
あなたは、単一のスレッドを使用する場合、それは彼が実行を許可された場合は、とにかくチェックする必要があるため、これは、さえ高価である。
あなたが同期セグメントの使用を減らす場合は、あなたのスレッドは、彼らが実行できるかどうかを確認するために停止する必要はありません(もちろん、彼らはデータを共有する必要はありません)。
同期作品はここを<見つけることができるかのハイレベルの概要/ P>
http://img20.imageshack.us/img20/2066/monitor28synchronizatioc.png >
<サブ> Javaのスタイルモニターサブ>
これは、Javaへの固有ではありません。正しく行われない場合、同期は、任意のマルチスレッド環境で「高価な」と考えることができます。それはJavaで特に悪いのかどうか、私は知りません。
これは、彼らが同じリソースを使用する場合は、同時に実行されているからスレッドを防ぎます。しかし、彼らはのため、の同じリソースを使用しない、ないより良いオプションは、(それが行う必要があります)ありません。
問題は、人々は、多くの場合、あまりにも大きな範囲を持つリソースを保護することです。例えば、悪い設計されたプログラムは、オブジェクトの配列全体よりもむしろアレイ(またはアレイの偶数部分)の個々の要素を同期させることができる。
この要素7を読み取ろうとするスレッドが素子22には必要ありませんを読んだり、書いスレッドを待たなければならないことを意味します。同期化の粒度はなく、アレイレベルの要素レベルであった場合、これらの2つのスレッドが互いに干渉しないであろう。
2つのスレッドがのと同じの要素にアクセスしようとしたときのみ、リソースの競合が存在することになります。一般的なルールのみ(もちろん同期の数、上の制限を受ける)可能な限り小さく、リソースを保護することである理由です。
しかし、代替が単一のリソース上で戦って二つのスレッドによるデータの破損がある場合は、正直に言うと、それはそれがどのように高価な問題ではありません。あなたのアプリケーションがあれば、パフォーマンス上の問題を心配正しくとだけ書くと、彼らが表示されたとき(「それはの後、は、それが速く作業を受ける最初の作業なさい」私の好きなマントラです)。
この記事は、実際には非常にうまく要点をまとめたもの同期の後ろます。
のでキャッシュのフラッシュおよび無効化を含むルールの、Java言語での同期ブロックは、一般的に、通常、原子「のテストと設定されたビット」機械命令で実装されている多くのプラットフォームで提供されるクリティカルセクション施設、より高価です。プログラムは、単一のプロセッサ上で実行されている単一スレッドのみが含まれている場合でも、同期メソッド呼び出しは非同期のメソッド呼び出しよりもまだ遅いです。同期が実際にロックするために競合する必要がある場合に必要ないくつかのスレッドスイッチとシステムコールが存在するであろうように、性能ペナルティは、実質的に大きい。
その他の回答をしているレベルの技術を詳細にたてるつもりはありませんの試みで再現する.
たいと思いまなおチェックの日を記事としての暗黙の能力や意識の著).同Java た 非常にゆっくり前JVMs.しかし、このネットワークのなかで人々が、最近では、uncontended同期がたくさんよりも早くと思いますが、uncontended同期を改善します。
されているということを、この質問に対して今のところ可能な場合に必要な同期を正確、 必要 同期を正.の回数だけが見えの速度が問題だったので作りlockless実施にくを使用して非常に効率的かつ複合 java.util.兼職の状況.ロックを解除します。AbstractQueuedSynchronizerやかに使用を検討その他の言語のためのデータベースです。
一般的だと思い最高の結論と同期を、一般に十分速く、余裕があります。利用になります。全ての性能の問題、コードのための明確性及び正確でなければな市場に出す前に指令に適合いを測定する高価な部品のご使用をご検討ください。通常、こんにコストの同期*.