CertificateFactory.getInstance("x.509")线程安全吗?

thi*_*lad 7 java certificate thread-safety x509

我无法确定CertificateFactory.getInstance("x.509")是否是线程安全的?有人可以澄清一下吗?

https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html

提前致谢.

Dar*_*ari 2

这个问题很旧,但这是这个问题的第一个谷歌搜索,所以这里是:

调用的结果是一个CertificateFactory实现,特别是(在 Oracle Java 中)一个sun.security.provider.X509Factory. 该工厂只有静态实例成员,[我检查了它们]是线程安全的。它还具有许多synchronized static方法,这表明该类在构建时考虑了线程安全。

所以我想说,在实践中,如果您确信您正在使用 Oracle Java(tm),那么您可以假设线程安全;但是,如果您正在使用其他 JRE,则需要检查它们。您始终可以安全地将值包装在 中ThreadLocal,例如:

private static final ThreadLocal<CertificateFactory> certFactory = 
    ThreadLocal.withInitial(() -> {
    try {
        return CertificateFactory.getInstance("x.509");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
});
Run Code Online (Sandbox Code Playgroud)

然后后来

public Certificate loadCertFrom(String filename) throws IOException, CertificateException {
    try (final FileInputStream in = new FileInputStream(filename)) {
        return certFactory.get().generateCertificate(in);
    }
}
Run Code Online (Sandbox Code Playgroud)