簡體   English   中英

DatatypeConverter是線程安全的嗎?

[英]Is DatatypeConverter thread-safe?

特別是javax.xml.bind.DatatypeConverter.parseBase64Binary(String)方法的方法是線程安全的嗎?

文檔中沒有任何內容表明該類是線程安全的。 因此我建議你認為不是。

我建議使用Apache Commons Codec中的Base64 ,它在文檔中聲明它是線程安全的。

我對源代碼的閱讀是實現是線程安全的。

  • parseBase64Binary方法調用parseBase64Binary共享上方法DatatypeConverterImpl被懶惰地創建的對象。

  • 很容易看出延遲創建是線程安全的。 (代碼在另一個答案......)

  • 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();
    }

    ...
}

我們可以假設它是線程安全的。 initConverter()方法是靜態同步的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM