【发布时间】:2017-10-04 05:29:04
【问题描述】:
我无法确定 CertificateFactory.getInstance("x.509") 是否是线程安全的?有人可以澄清一下吗?
https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html
提前致谢。
【问题讨论】:
标签: java thread-safety certificate x509
我无法确定 CertificateFactory.getInstance("x.509") 是否是线程安全的?有人可以澄清一下吗?
https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html
提前致谢。
【问题讨论】:
标签: java thread-safety certificate x509
这个问题很老,但它是该问题的第一个谷歌点击,所以这里是:
您调用的结果是一个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);
}
});
后来
public Certificate loadCertFrom(String filename) throws IOException, CertificateException {
try (final FileInputStream in = new FileInputStream(filename)) {
return certFactory.get().generateCertificate(in);
}
}
【讨论】: