20

C++ プログラマーとして Java に慣れてきた私にとって、オブジェクトがそのようなロックをサポートしているという宣言がなくても、任意のオブジェクトをロックするための言語レベルのサポートを目にするのは少し奇妙です。オブジェクトごとにミューテックスを作成することは、自動的にオプトインするにはかなりのコストがかかるように思えます。メモリ使用量以外に、mutex は一部のプラットフォームでは OS の制限付きリソースです。ミューテックスが利用できない場合はスピンロックできますが、そのパフォーマンス特性は大幅に異なるため、予測可能性が損なわれると予想されます。

JVM は、特定のオブジェクトが synchronized キーワードのターゲットにならないことを認識してミューテックスの作成を回避できるほどスマートですか? ミューテックスは遅延して作成できますが、それ自体がミューテックスを必要とするブートストラップの問題を引き起こします。それが回避されたとしても、ミューテックスが既に作成されているかどうかを追跡するためのオーバーヘッドがまだあると思います。したがって、そのような最適化が可能であれば、コンパイル時または起動時に行う必要があると思います。C++ では、コンパイル モデルが原因でこのような最適化は不可能です (オブジェクトのロックがライブラリの境界を越えて使用されるかどうかはわかりません) が、Java のコンパイルとリンクについては十分に知りません。同じ制限が適用される場合。

4

4 に答える 4

17

一部の JVM がロックを実装する方法を調べた人物として言えば ...

通常のアプローチでは、オブジェクトのヘッダー ワードに予約済みのビットをいくつか用意して開始します。オブジェクトがロックされていない場合、またはロックされていても競合がない場合は、そのままになります。ロックされたオブジェクトで競合が発生した場合、JVMロックを本格的なミューテックス データ構造に拡張し、オブジェクトの存続期間中はその状態を保ちます。

編集-OPがOSでサポートされているミューテックスについて話していることに気づきました。私が見た例では、膨張していないミューテックスは、pthread ライブラリ関数などを使用するのではなく、CAS 命令などを使用して直接実装されていました。

于 2009-12-14T00:46:52.677 に答える
2

オブジェクトが決してロックとして使用されないという保証はありません (リフレクションを考慮してください)。通常、すべてのオブジェクトには、ロック専用のビットを含むヘッダーがあります。ヘッダーが必要な場合にのみ追加されるように実装することは可能ですが、それは少し複雑になり、おそらく何らかのヘッダー (クラス (「vtbl」と C++ の割り当てサイズに相当)、ハッシュ コード、およびガベージ コレクション) が必要になるでしょう。 .

これは、OpenJDK での同期の実装に関する wiki ページです。

(私の意見では、すべてのオブジェクトにロックを追加するのは間違いでした。)

于 2009-12-14T00:38:27.783 に答える
2

これは実際には JVM の実装の詳細であり、JVM によって実装が異なる場合があります。ただし、 Java は実行時にリンクするため、コンパイル時に最適化できるものではないことは間違いありません。これにより、これまで知られていないコードが古いコードで作成されたオブジェクトを取得し、同期を開始する可能性があります。

Java 用語では、同期プリミティブはミューテックスではなく「モニター」と呼ばれ、特別なバイトコード操作によってサポートされていることに注意してください。ここにかなり詳細な説明があります。

于 2009-12-14T00:47:34.987 に答える
1

JVMはコンペアアンドスワップ命令を直接使用できませんか? 各オブジェクトに、lockingThreadIdそれをロックしているスレッドの ID を格納するフィールドがあるとします。

while( compare_and_swap (obj.lockingThreadId, null, thisThreadId) != thisTheadId )
    // failed, someone else got it
    mark this thread as waiting on obj.
    shelf this thead

//out of loop. now this thread locked the object

do the work

obj.lockingThreadId = null;
wake up threads waiting on the obj

これはおもちゃのモデルですが、それほど高価ではなく、OS に依存していません。

于 2009-12-14T01:25:50.263 に答える