1

1)いくつかのパラメーターを渡すネイティブJava関数があり、その実装はオブジェクトを作成するネイティブC ++コンストラクターであり、ポインターからオブジェクトにキャストされるlongを返します。このオブジェクトの構築されたメンバーは事実上不変です。C++ オブジェクトは、構築された状態に基づいて作業を行うことができます。

2) 関数呼び出しの結果を取得する Java コードは、ポインタの長いバージョンを (mutex なしで) どこかに安全に発行し、揮発性変数を変更して、ネイティブ C++ オブジェクトのメモリ変更を他のスレッドに発行することを期待しています。

ここで、別のスレッドが 2) の揮発性変数を読み取り、公開された long を取得し、C++ メモリ空間内の事実上不変オブジェクトにアクセスして何らかの作業を行う別のネイティブ関数を呼び出します。

質問: 揮発性とフェンスに関する Java メモリ モデルの保証により、他のスレッドは完全に構築されたネイティブ オブジェクトを参照することが保証されていますか? 一部のプラットフォームでは答えはイエスだと思いますが、フェンスを使用すると、さまざまなチップがさまざまな方法で機能することがわかり、Java が利用可能なすべてのプラットフォームについて疑問に思っていました。

4

3 に答える 3

2

JCIP の共著者は、並行性に関する JSR メーリング リストの質問に回答しました。

彼は次のように述べています。 "、したがって、"実際には、この [質問で説明されている揮発性の公開の試み] は正常に機能します (通常のプロセス メモリを使用している限り)"。

メーリング リストの別の回答者は次のように述べています。しかし、「その[動作]の書面による保証はありません」と付け加えています.

于 2012-08-27T23:31:16.023 に答える
0

Javaコードからネイティブコードに渡すものはコピーされ、ネイティブコードに適切なデータ型で渡されます(たとえば、C++持ってunsigned intいるJavaがない、null終了した文字列など)。
その後、スレッドの問題はネイティブコードの実装に関連します。
基本的には同じAPIです。APIの契約は何ですか?複数のスレッドから安全にアクセスできることを指定していますか?

于 2012-08-26T13:31:51.887 に答える
0

Java は、C コードで作成したネイティブ オブジェクトの存在さえ認識していません。Java が知っていて、その動作を保証できるのは、volatile long だけです。

于 2012-08-27T21:49:37.843 に答える