DatatypeConverter是线程安全的吗?

时间:2014-10-10 08:56:29

标签: java thread-safety base64 jaxp

特别是方法javax.xml.bind.DatatypeConverter.parseBase64Binary(String)线程安全吗?

3 个答案:

答案 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()方法是静态同步的。