1)いくつかのパラメーターを渡すネイティブJava関数があり、その実装はオブジェクトを作成するネイティブC ++コンストラクターであり、ポインターからオブジェクトにキャストされるlongを返します。このオブジェクトの構築されたメンバーは事実上不変です。C++ オブジェクトは、構築された状態に基づいて作業を行うことができます。
2) 関数呼び出しの結果を取得する Java コードは、ポインタの長いバージョンを (mutex なしで) どこかに安全に発行し、揮発性変数を変更して、ネイティブ C++ オブジェクトのメモリ変更を他のスレッドに発行することを期待しています。
ここで、別のスレッドが 2) の揮発性変数を読み取り、公開された long を取得し、C++ メモリ空間内の事実上不変オブジェクトにアクセスして何らかの作業を行う別のネイティブ関数を呼び出します。
質問: 揮発性とフェンスに関する Java メモリ モデルの保証により、他のスレッドは完全に構築されたネイティブ オブジェクトを参照することが保証されていますか? 一部のプラットフォームでは答えはイエスだと思いますが、フェンスを使用すると、さまざまなチップがさまざまな方法で機能することがわかり、Java が利用可能なすべてのプラットフォームについて疑問に思っていました。