我无法确定CertificateFactory.getInstance(“x.509”)是否是线程安全的?有人可以澄清一下吗?
https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html
提前致谢。
最佳答案
这个问题很旧,但这是该问题的第一个Google搜索结果,因此,这里是:
调用的结果是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);
}
}