2012-03-25 14 views
0

JAXBはゼロ引数のコンストラクタを呼び出し、非volatileフィールドの埋め込みを開始してリストに追加します。私自身のコードでJAXBは同時アクセスで安全ですか?(完了方法)

すぐに(非整列化を)これをやった後に生成されたBeanは、いくつかのaddメソッドの上にいくつかのワーカースレッドに追放ではなく、コンストラクタまたはフラッシュするためにメモリモデルをトリガーする他の方法を介して取得共有領域との間でデータを再取得します。

これは安全ですか?あるいは、JAXBは舞台裏でいくつかの魔法を使うのですか?私はすべてのスレッドですべてが可視であるように強制することができるJavaプログラミング言語の方法について考えることはできません。 JAXBで生成されたBeanのユーザーは、同時設定で目に見えないフィールドが設定されている可能性について心配する必要がありますか?

編集:なぜ多くのダウンボックスがありますか?誰もまだJAXBがこのように不可能な仕事をどのように保証するのか説明できませんでした。私はあなたの質問では、様々な「事実」を調査するために気にしないだろう

+2

"...ただし、コンストラクタまたは共有領域との間でデータをフラッシュして再フェッチするメモリモデルをトリガするその他の方法ではありません":どのようにそれを知っていますか?これは単に根拠のない推測です。 – EJP

+1

私は自分のコードのスレッドにそれらを投げるので。なぜこれは推測だろうか? –

+0

コード内のスレッドに*何を*スローしますか?あなたの質問は何ですか?あなたはどんな証拠も提示せずに推測の嵐を起こしました。 FYI JAXBには魔力はありません。オブジェクトを構築し、getterとsetterを呼び出します。 – EJP

答えて

3

、私は言い換えます:

「を参照しなければ、それは真実ではありません!」 Javaでスレッドを扱う誰もがこれらの日が実際に前に、たまたま起こっ-後に不注意関係の確立を避けるためにをしようとする必要があります、と述べ

。 volatile変数、synchronizedブロック、Lockオブジェクト、または原子変数の使用は、そのような関係を確立するためにバインドされます。それはすぐにブロックキュー、同期ハッシュマップと他のビットとピースの全体を引き出します。

JAXBの実装が実際に間違ったことをしているとはどういうことでしょうか? JAXBがJAXBで処理されると、JAXBから取得されるオブジェクトはJavaオブジェクトと同じくらい安全ですが、マーシャリング/アンマーシャルメソッド自体are not thread-safeです。

  • スレッドがJAXBハンドラオブジェクトを共有していない限り、心配する必要はありません。

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

EDIT:

今あなたが編集していることあなたの質問より具体的な答えを提供することができます:

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

ありはこの落とし穴を回避するために、すなわちuse of final fields and immutable objects経由の方法、ですが、権利を取得することは非常に難しいです、especially with JAXB、およびすべてのスレッドがあるように、それは実際に正しいオブジェクト参照を伝播の問題を解決していません同じオブジェクトを見ている。

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

+1

"参照がなければ真実ではありません!"私の質問には事実ではありません。それは事実との答えを待っている質問です。 JAXBがどのようにこの問題を処理しているのかわからないので、私は尋ねています。それは答えではない質問です。 –

関連する問題