特别是,
javax.xml.bind.DatatypeConverter.parseBase64Binary(String)
方法是否线程安全?javax.xml.bind.DatatypeConverter.parseBase64Binary(String)
方法是否线程安全?文档中没有任何关于该类是线程安全的建议。因此,我建议您假设它不是。
我建议您使用来自Apache Commons Codec的Base64
,该文档中声明它是线程安全的。
根据我对源代码的阅读,该实现是线程安全的。
parseBase64Binary
方法在共享的DatatypeConverterImpl
对象上调用parseBase64Binary
方法,并且该对象是惰性创建的。
很容易看出这种惰性创建是线程安全的。(代码在另一个答案中...)
检查DatatypeConverterImpl
发现它没有实例变量,因此无法关注访问/更新实例状态的线程安全问题。
DatatypeConverterImpl.parseBase64Binary
方法(反过来)调用static
_parseBase64Binary
方法。
_parseBase64Binary
方法使用其输入(不可变)和引用线程限制对象的本地变量。唯一的例外是decodeMap
变量,它是一个private static final
数组。
decodeMap
变量在类(静态)初始化期间初始化并安全发布。
初始化后,decodeMap
变量只能被读取。因此,不存在与更新相关的同步问题或内存模型“危险”。
当然,这种分析仅适用于我链接的类版本。其他版本可能不是线程安全的。(但源代码可供多个版本自由使用,因此您应该能够检查您正在使用的JAXP版本是否为线程安全。)
查看了 javax.xml.bind.DatatypeConverter.parseBase64Binary(String)
的源代码(JAXB api),这是一个使用不可变类作为参数的静态方法。
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();
}
...
}
theConverter.parseBase64Binary(...)
怎么办? - Alex