【问题标题】:Is CertificateFactory.getInstance("x.509") thread safe?CertificateFactory.getInstance("x.509") 线程安全吗?
【发布时间】: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


    【解决方案1】:

    这个问题很老,但它是该问题的第一个谷歌点击,所以这里是:

    您调用的结果是一个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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      相关资源
      最近更新 更多