同期を廃止し、待機して通知する時間ですか?


13

synchronizedを使用するよりも使用することが望ましい単一のシナリオ(古代のJVMとの互換性以外)がありますLockか?誰でも新しいシステムを使用しwaitたりnotify、新しいシステム上で正当化することはできますか?

実装でそれらのいずれかを使用する必要があるアルゴリズムはありますか?

この問題に触れた以前の質問がありますが、これをもう少し詳しく見ていきたいと思いdeprecateます。新しい施設で解決されたtrapや落とし穴、注意事項は非常に多くあります。すぐにそれらを陳腐化する時が来るかもしれないと感じています。


4
Brian GoetzのJava Concurrency in Practiceを読んでいますか?彼は暗黙的ロックと明示的ロックの議論をうまくカバーしています。
マルタインVerburg

@MartijnVerburg-残念ながら、彼の作品には大きな敬意を払っています。
OldCurmudgeon

1
synchronizedキーワードは、スレッドセーフである必要のある単純な静的メソッドで、私が並行処理を使用する他のすべての場合に便利です。しかし、これは私の意見です
ケモダ

回答:


12

その実装でそれらのいずれかを使用する必要があるアルゴリズムはありますか?

ほぼ間違いない。(確かに、理論的な観点から、あなたは。/他のjava.util.concurrentのを使用して通知シミュレート待機することができるはずですあなたがロックを解除するために注意する必要があるだろうけれども...クラス。そして、明示的なロック操作に置き換えることができ、同期finally条項。)

ただし、Javaで最高のパフォーマンスを実現する実装には、待機と通知の有無にかかわらず、同期を直接使用するアルゴリズムが含まれている可能性があります。


同期を廃止し、待機して通知する時間ですか?

前の質問に対する答えに関係なく、答えは間違いなくノーです。

待機/通知は正しく使用できます(多くの場合使用されます)。Javaでは、非推奨は壊れたクラスとメソッドのために予約されています。すなわち、緊急の問題として継続使用を修正する必要がある場合。Sun(および現在はOracle)が、基本的なものやwait / notifyとして広く使用されているものを非推奨にすると、大量のレガシーコードに対して深刻な互換性の問題が発生します。それは誰の利益にもなりません。

コードの同期/待機/通知を削除したい場合は、それで問題ありません。しかし、非推奨では、本質的に正しいマルチスレッドコードを大量に書き直す必要があり、それは悪い考えです。企業のITマネージャーとソフトウェア製品マネージャーは、提案することであなたを憎むでしょう...


Javaのドキュメントによると、「非推奨」の意味を読む価値があります:http : //docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

また、Java言語の中核となるものの廃止について話していることに注意してください。廃止することにsynchronizedは大きな影響があります。


実際、私が思い出す限りでは、優れた「実践におけるJava並行性」の本によれば、java.util.concurrentutilクラスは実際には高速です。舞台裏では、これらのクラスがVMと直接通信します。同期されると、オブジェクトグラフ内のオブジェクトに鈍いロックがインストールされ、グローバルパフォーマンスに影響します。
-akuhn

私が実際にsynchronizedet を削除することを示唆するものに出会った場合、@ Stephenを許してください。al。私は単に非推奨を提案しているだけで、実際には新しいコードにはこれを使用しないでください。私は、それらの削除を要求してきた、試行錯誤されたレガシーコードの損傷を示唆することを夢見ていません。
-OldCurmudgeon

@OldCurmudgeon-かなり遅い応答ですが、非推奨は極端すぎると思います。1)機能削除できることを意味します。2)機能が壊れていることを意味します。単に昔ながらの機能とは異なります。3)多くの人々は、新しいコードをそのように書くことにまだ満足しています...そして、そうすべきでない強い理由はありません。4)それを落胆させる「あなたの顔に」他のより少ない方法があります; 例えば書き込みPMDのルール...
スティーブンC

@StephenC-大学で使われたり教えられなくなったりする結果となる、少し劇的なアクションがありますか?それらは明らかに避けるべきです。PMDルールは-良いアイデアですが-すぐに教師に届かないと思います。
-OldCurmudgeon

1
@StephenCちょっとした注意:リンク先のJavaドキュメントを見ると、非推奨とは非推奨のコードが壊れていることを意味するとは思わない。それが理由の1つですが、ドキュメントにあるように、APIは新しい、より優れたAPIに取って代わられたときに非推奨になります(OPが並行性を主張しているように)。そして、低レベルの並行性は、実際に悪い慣行を奨励していない場合、間違いなく非常にエラーを起こしやすいです。
アンドレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.