Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DatatypeConverter线程安全吗?_Java_Thread Safety_Base64_Jaxp - Fatal编程技术网

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并发教程:“原子操作不能交错,因此它们可以在不担心线程干扰的情况下使用。但是,这并不能消除同步原子操作的所有需要,因为内存一致性错误仍然是可能的。”谢谢。我不明白为什么这个类不允许您构建一个单独的实例来避免此类问题…嗯。。。大概因为没有问题可以避免。但是根据这种逻辑,他们应该指定该方法是线程安全的。