質問

私は本当に新しいJava、こ synchronized は"非常に高価な"Java.すべての知りたいような高価などです。

感謝。

役に立ちましたか?

解決

多分それはあなたが思うほど悪くはありません

これは、(あなたはそれが「非常に高価」であったことを読んで、なぜ可能性がある)ひどいことに使用されます。これらのミームが出て死ぬために長い時間がかかることがあります。

  同期はどのように高価な

で?

     

のでキャッシュのフラッシュおよび無効化を含むルールの、Java言語での同期ブロックは、一般的に、通常、原子「のテストと設定されたビット」機械命令で実装されている多くのプラットフォームで提供されるクリティカルセクション施設、より高価です。プログラムは、単一のプロセッサ上で実行されている単一スレッドのみが含まれている場合でも、同期メソッド呼び出しは、まだ未同期メソッドの呼び出しよりも遅くなります。同期が実際にロックするために競合する必要がある場合に必要ないくつかのスレッドスイッチとシステムコールが存在するであろうように、性能ペナルティは、実質的に大きい。

     

幸いなことに、JVMの継続的な改善は、両方の全体的なJavaプログラムのパフォーマンスを改善し、各リリース同期の相対的なコストを低減し、将来の改善が期待されています。さらに、同期のパフォーマンスコストはしばしば誇張されています。 1つの周知のソースは、同期メソッド呼び出しが未同期メソッド呼び出しよりも最大50倍遅いことを引用しました。この文は本当かもしれないが、それはまた、非常に誤解を招くおそれがあり、それが必要とされている場合にも、同期を避けるために多くの開発者をリードしてきました。

並行プログラミングはまだ遅くすることができますが、それにはあまりないが、今、純粋にJavaの障害である -

と言いました。罰金と粗ロックの間のトレードオフがあります。あまりにも粗いが明らかに悪いですが、ロックが非ゼロのコストを持っているとして、それは、あまりにも細かすぎることが可能です。

これは、競合の下で特定のリソースを考慮することが重要です。機械的なハードディスクは、より多くのスレッドがの悪い方のパフォーマンスにつながる可能性の例です。

他のヒント

これは、Javaへの固有ではありません。正しく行われない場合、同期は、任意のマルチスレッド環境で「高価な」と考えることができます。それはJavaで特に悪いのかどうか、私は知りません。

これは、彼らが同じリソースを使用する場合は、同時に実行されているからスレッドを防ぎます。しかし、彼らはのため、の同じリソースを使用しない、ないより良いオプションは、(それが行う必要があります)ありません。

問題は、人々は、多くの場合、あまりにも大きな範囲を持つリソースを保護することです。例えば、悪い設計されたプログラムは、オブジェクトの配列全体よりもむしろアレイ(またはアレイの偶数部分)の個々の要素を同期させることができる。

この要素7を読み取ろうとするスレッドが素子22には必要ありませんを読んだり、書いスレッドを待たなければならないことを意味します。同期化の粒度はなく、アレイレベルの要素レベルであった場合、これらの2つのスレッドが互いに干渉しないであろう。

2つのスレッドがのと同じの要素にアクセスしようとしたときのみ、

リソースの競合が存在することになります。一般的なルールのみ(もちろん同期の数、上の制限を受ける)可能な限り小さく、リソースを保護することである理由です。

しかし、代替が単一のリソース上で戦って二つのスレッドによるデータの破損がある場合は、正直に言うと、それはそれがどのように高価な問題ではありません。あなたのアプリケーションがあれば、パフォーマンス上の問題を心配正しくとだけ書くと、彼らが表示されたとき(「それはの後、は、それが速く作業を受ける最初の作業なさい」私の好きなマントラです)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top