私はあなたの質問のさまざまな「事実」をわざわざ調査するつもりはありません。言い換えれば、次のようになります。
「参照なしでは、それは真実ではありません!」
とは言うものの、最近Javaでスレッドを扱う人は、実際には、不注意で発生前と発生後の関係を確立しないようにする必要があります。揮発性変数、同期ブロック、ロックオブジェクト、またはアトミック変数を使用すると、このような関係が確立されます。これにより、ブロッキングキュー、同期されたハッシュマップ、その他の多くの要素がすぐに取り込まれます。
JAXB実装が実際に間違ったことを実行することに成功したことをどのように確信していますか?
とは言うものの、JAXBから取得したオブジェクトは、JAXBが実行されると、Javaオブジェクトとほぼ同じくらい安全ですが、マーシャリング/アンマーシャリングメソッド自体はスレッドセーフではありません。次の場合を除いて、心配する必要はないと思います。
編集:
質問を編集したので、より具体的な回答を提供できます。
JAXBで生成されたオブジェクトは、他のJavaオブジェクトと同じようにスレッドセーフですが、まったくそうではありません。直接コンストラクター呼び出しは、それ自体ではスレッドセーフを提供しません。確立された発生前new
の関係がない場合、JVMは、が呼び出されたときに部分的に初期化されたオブジェクトを自由に返すことができます。
この落とし穴を回避するには、つまり、finalフィールドと不変オブジェクトを使用する方法がありますが、特にJAXBを使用する場合は、正しく理解するのが非常に難しく、正しいオブジェクト参照を伝播する問題を実際に解決するわけではありません。スレッドは同じオブジェクトを見ています。
結論:適切な同期方法を使用して、スレッド間でデータを安全に移動するのはあなた次第です。明確に文書化されているものを除いて、基礎となる実装について何も想定しないでください。それでも、安全にプレイし、防御的にコーディングすることをお勧めします。通常、スレッド間の相互作用がより明確になります。後の段階でプロファイラーがパフォーマンスの問題を示した場合は、同期コードの微調整について検討を開始する必要があります。