JavaのLockSupportメモリーの一貫性
-
21-09-2019 - |
質問
Java 6のAPIの質問。呼び出しLockSupport.unpark(thread)
は持っていますは事前発生のジャスト・パーク解除スレッドでLockSupport.park
からのリターンとの関係?私は強く答えはイエスである疑いがあるが、Javadocは明示的に言及していないようです。
解決
私は、JDKコードかかわらず、見ているとLockSupport方法は、通常の同期ブロックの外側で呼ばれているように見えます。だから、あなたの仮定が正しいと思われます。
他のヒント
私はこの質問を発見しました。 オラクルの研究者によってにこの記事<のhref = "https://labs.oracleによると、 ?.COM / PLS /頂点/ F pは=ラボ%3abio:0:29" のrel = "noreferrerは">デビッド・ダイスには、答えは<強いように思わ>なしの。ここでは、物品の関連部分があります:
スレッドがpark()
でブロックされている場合は、私たちは、その後のことを保証しています
unpark()
は、それが準備をします。完全に合法しかし、低品質park()
とunpark()
の実装はここで、空のメソッドになります このプログラムは、単純な回転に退化します。 を実際にだこと 正しいpark()
-unpark()
の使用のためのリトマス試験の
空park()
とunpark()
方法があなたに与えていない任意のは事前発生の関係を保証し、あなたのプログラムが100%移植可能にするために、あなたがそれらに頼るべきではありませんので。
その後、再び、ののJavadoc LockSupport のは言う:
これらのメソッドは、作成するためのツールとして使用するように設計されています より高いレベルの同期ユーティリティ、およびそれ自身ではありません ほとんどの同時制御アプリケーションに便利。
park
方法であります フォームだけの構成で使用するために設計されます:
while (!canProceed()) { ... LockSupport.park(this); }
あなたが明示的にvolatile
または適切に同期変数を伴うだろういずれかが、とにかく、いくつかの条件をチェックする必要があるので、park()
の弱い保証が実際に問題になることはありません、右?
あなたはそれが関係する前に起こるの作成に頼ることができないように文書化されていない場合ます。
のコードは単にUnsafe.parkを呼び出し、.unpark!
ホットスポットに具体的にLockSupport.javaは事前発生の関係は、一般的に揮発性のステータスフラグまたは類似した何かのライト - リード組から来るます。
は、それがの問題が発生した-前にの関係を作成するように文書化されていない場合、あなたはを覚えておいて、それはあなたがそれがないことを証明することができない場合であってもかのようにはそれを扱う必要があります特定のシステム上の。将来のシステムおよび実装はないかもしれません。彼らは正当な理由のために自分自身にその自由を残しています。