[英]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.