特别是方法javax.xml.bind.DatatypeConverter.parseBase64Binary(String)
线程安全吗?
答案 0 :(得分:5)
文档中没有任何内容表明该类是线程安全的。因此,我建议你认为它不是。
我建议来自Apache Commons Codec的Base64
,它在文档中声明它是线程安全的。
答案 1 :(得分:2)
我对source code的解读是 实现是线程安全的。
parseBase64Binary
方法在懒惰创建的共享parseBase64Binary
对象上调用DatatypeConverterImpl
方法。
很容易看出延迟创建是线程安全的。 (代码在另一个答案......)
对DatatypeConverterImpl
的检查表明它没有实例变量,因此不能对访问/更新实例状态的线程安全问题。
DatatypeConverterImpl.parseBase64Binary
方法(依次)调用static
_parseBase64Binary
方法。
_parseBase64Binary
方法使用其输入(不可变)和引用线程限制对象的局部变量。唯一的例外是decodeMap
变量,它是private static final
数组。
decodeMap
变量在类(静态)初始化期间初始化并安全发布。
初始化后,只会读取decodeMap
变量。因此,可能没有同步问题或存储模型"危险"与更新有关。
当然,此分析仅适用于我链接到的类的版本。可以想象,该方法在其他版本中不是线程安全的。 (但是源代码可以免费用于多个版本,因此您应该能够检查这个版本的JAXP。)
答案 2 :(得分:0)
看一下使用不可变类作为参数的静态方法的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();
}
...
}
我们可以假设它的线程安全。 initConverter()方法是静态同步的。