Java DatatypeConverter线程安全吗?
特别是方法Java DatatypeConverter线程安全吗?,java,thread-safety,base64,jaxp,Java,Thread Safety,Base64,Jaxp,特别是方法javax.xml.bind.DatatypeConverter.parseBase64Binary(String)是线程安全的吗?文档中没有任何内容表明该类是线程安全的。因此,我建议你假设它不是 我推荐Apache Commons Codec,它在文档中声明它是线程安全的。在查看了javax.xml.bind.DatatypeConverter.parseBase64Binary(String)源代码()之后,它是一个使用不可变类作为参数的静态方法 final public clas
javax.xml.bind.DatatypeConverter.parseBase64Binary(String)
是线程安全的吗?文档中没有任何内容表明该类是线程安全的。因此,我建议你假设它不是
我推荐Apache Commons Codec,它在文档中声明它是线程安全的。在查看了
javax.xml.bind.DatatypeConverter.parseBase64Binary(String)
源代码()之后,它是一个使用不可变类作为参数的静态方法
final public class DatatypeConverter {
...
// delegate to this instance of DatatypeConverter
private static volatile DatatypeConverterInterface theConverter = null;
...
public static byte[] parseBase64Binary( String lexicalXSDBase64Binary ) {
if (theConverter == null) initConverter();
return theConverter.parseBase64Binary( lexicalXSDBase64Binary );
}
...
private static synchronized void initConverter() {
theConverter = new DatatypeConverterImpl();
}
...
}
我们可以假设它是线程安全的。initConverter()方法是静态同步的。我对的理解是该实现是线程安全的
方法对延迟创建的共享parseBase64Binary
对象调用DatatypeConverterImpl
方法parseBase64Binary
- 很容易看出,延迟创建是线程安全的。(代码在另一个答案中…)
- 对
的检查表明,它没有实例变量,因此对实例状态的访问/更新不存在线程安全问题DatatypeConverterImpl
方法(依次)调用DatatypeConverterImpl.parseBase64Binary
static
方法\u parseBase64Binary
方法使用其输入(不可变)和引用线程受限对象的局部变量。唯一的例外是\u parseBase64Binary
变量,它是一个decodeMap
数组私有静态final
变量在类(静态)初始化期间初始化并安全发布decodeMap
- 初始化后,
变量仅会被读取。因此,不可能存在与更新相关的同步问题或内存模型“危险”decodeMap
当然,这种分析只适用于我链接到的类的版本。可以想象,该方法在其他版本中不是线程安全的。(但是源代码可免费用于多个版本,因此您应该能够检查您正在使用的JAXP版本。)是的,但是converter.parseBase64Binary(…)?如果查看源代码,converter实例是不稳定的OK,但是我们仍然会遇到一些问题……摘自Java并发教程:“原子操作不能交错,因此它们可以在不担心线程干扰的情况下使用。但是,这并不能消除同步原子操作的所有需要,因为内存一致性错误仍然是可能的。”谢谢。我不明白为什么这个类不允许您构建一个单独的实例来避免此类问题…嗯。。。大概因为没有问题可以避免。但是根据这种逻辑,他们应该指定该方法是线程安全的。