我无法确定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);
    }
}

08-03 16:40