我不会费心去调查你问题中的各种“事实”,我只是解释一下:
“没有参考就不是真的!”
这就是说,现在任何在 Java 中处理线程的人都必须真正尝试避免无意中建立发生之前和发生后的关系。任何对 volatile 变量、同步块、Lock 对象或原子变量的使用都必然会建立这种关系。这会立即引入阻塞队列、同步哈希映射和许多其他零碎的东西。
您如何确定 JAXB 实现实际上会做错事?
也就是说,虽然从 JAXB 获得的对象在使用 JAXB 完成后与任何 Java 对象一样安全,但编组/解编组方法本身并不是线程安全的。我相信您不必担心,除非:
编辑:
现在您已经编辑了您的问题,我们可以提供更具体的答案:
JAXB 生成的对象与任何其他 Java 对象一样是线程安全的,而这根本不是。直接构造函数调用本身也不提供线程安全性。如果没有建立之前发生的new
关系,JVM 可以在调用时自由地返回部分初始化的对象。
有一些方法,即通过使用 final 字段和不可变对象,可以避免这个陷阱,但是很难做到正确,尤其是使用 JAXB,而且它实际上并没有解决传播正确对象引用的问题,以便所有线程正在查看同一个对象。
底线:您可以通过使用适当的同步方法在线程之间安全地移动数据。不要假设任何关于底层实现的东西,除非有明确的记录。即使这样,最好还是安全地进行编码并进行防御性编码-无论如何,这通常会导致线程之间的交互更加清晰。如果在稍后阶段探查器指示性能问题,那么您应该开始考虑微调您的同步代码。