C++ プログラマーとして Java に慣れてきた私にとって、オブジェクトがそのようなロックをサポートしているという宣言がなくても、任意のオブジェクトをロックするための言語レベルのサポートを目にするのは少し奇妙です。オブジェクトごとにミューテックスを作成することは、自動的にオプトインするにはかなりのコストがかかるように思えます。メモリ使用量以外に、mutex は一部のプラットフォームでは OS の制限付きリソースです。ミューテックスが利用できない場合はスピンロックできますが、そのパフォーマンス特性は大幅に異なるため、予測可能性が損なわれると予想されます。
JVM は、特定のオブジェクトが synchronized キーワードのターゲットにならないことを認識してミューテックスの作成を回避できるほどスマートですか? ミューテックスは遅延して作成できますが、それ自体がミューテックスを必要とするブートストラップの問題を引き起こします。それが回避されたとしても、ミューテックスが既に作成されているかどうかを追跡するためのオーバーヘッドがまだあると思います。したがって、そのような最適化が可能であれば、コンパイル時または起動時に行う必要があると思います。C++ では、コンパイル モデルが原因でこのような最適化は不可能です (オブジェクトのロックがライブラリの境界を越えて使用されるかどうかはわかりません) が、Java のコンパイルとリンクについては十分に知りません。同じ制限が適用される場合。