-1

JAXBはゼロ引数コンストラクターを呼び出してから、不揮発性フィールドへの入力を開始し、リストにデータを追加すると思います。

私自身のコードでは:これ(アンマーシャリング)を行った直後に、生成されたBeanは、いくつかのaddメソッドを介して一部のワーカースレッドに強制送還されますが、コンストラクターや、メモリモデルがデータをフラッシュして再フェッチするトリガーとなるその他の方法を介してではありません。共有エリアから。

これは安全ですか?それとも、JAXBは舞台裏で魔法のトリックをしますか?すべてのスレッドにすべてが表示されるように強制できるJavaプログラミング言語の方法は考えられません。JAXBで生成されたBeanのユーザーは、並行セットアップでフィールドが目に見えて設定されていない可能性があることを心配する必要がありますか?

編集:なぜこれほど多くの反対票があるのですか?JAXBがこの一見不可能なタスクをどのように保証するかをまだ誰も説明できませんでした。

4

1 に答える 1

3

私はあなたの質問のさまざまな「事実」をわざわざ調査するつもりはありません。言い換えれば、次のようになります。

「参照なしでは、それは真実ではありません!」

とは言うものの、最近Javaでスレッドを扱う人は、実際には、不注意で発生発生後の関係を確立しないようにする必要があります。揮発性変数、同期ブロック、ロックオブジェクト、またはアトミック変数を使用すると、このような関係が確立されます。これにより、ブロッキングキュー、同期されたハッシュマップ、その他の多くの要素がすぐに取り込まれます。

JAXB実装が実際に間違ったことを実行することに成功したことをどのように確信していますか?

とは言うものの、JAXBから取得したオブジェクトは、JAXBが実行されると、Javaオブジェクトとほぼ同じくらい安全ですが、マーシャリング/アンマーシャリングメソッド自体はスレッドセーフではありません。次の場合を除いて、心配する必要はないと思います。

  • スレッドはJAXBハンドラーオブジェクトを共有します。

  • 同期せずにスレッド間でオブジェクトを渡している:それらのオブジェクトがどこから来たかに関係なく、明らかに不健康な慣行...

編集:

質問を編集したので、より具体的な回答を提供できます。

JAXBで生成されたオブジェクトは、他のJavaオブジェクトと同じようにスレッドセーフですが、まったくそうではありません。直接コンストラクター呼び出しは、それ自体ではスレッドセーフを提供しません。確立された発生前newの関係がない場合、JVMは、が呼び出されたときに部分的に初期化されたオブジェクトを自由に返すことができます。

この落とし穴を回避するには、つまり、finalフィールドと不変オブジェクトを使用する方法がありますが、特にJAXBを使用する場合は、正しく理解するのが非常に難しく、正しいオブジェクト参照を伝播する問題を実際に解決するわけではありません。スレッドは同じオブジェクトを見ています。

結論:適切な同期方法を使用して、スレッド間でデータを安全に移動するのはあなた次第です。明確に文書化されているものを除いて、基礎となる実装について何も想定しないでください。それでも、安全にプレイし、防御的にコーディングすることをお勧めします。通常、スレッド間の相互作用がより明確になります。後の段階でプロファイラーがパフォーマンスの問題を示した場合は同期コードの微調整について検討を開始する必要があります。

于 2012-03-25T23:58:53.057 に答える