java.security.cert.Certificate中的验证方法是否是线程安全的?

时间:2011-05-19 07:07:12

标签: java security thread-safety

通常,java.security.cert.Certificate中的验证方法是否可以被视为线程安全的?具体而言,verify(PublicKey key)verify(PublicKey key, String sigProvider)。多个线程可以同时调用这些方法而不必担心它们会以线程不安全的方式修改内部数据吗?

JavaDoc没有提及任何相关内容。也许这是特定于实现的?

我想做这样的事情:

Certificate certificate = getCertificateFromCache();
certificate.verify(whatever);

理想情况下,不要将其放在同步块中。

2 个答案:

答案 0 :(得分:3)

Certificate.verify是一种抽象方法。因此,从这个角度来看,无法保证所有实现始终是线程安全的。也许实际证书实现的文档会告诉您一些相关信息,但为了安全起见,您可能必须同步调用以验证实际证书。

也许您可以创建类似于相同证书实例池的东西来绕过该问题。然后,您可以在同一证书的不同实例上并行验证。

答案 1 :(得分:0)

查看sun.security.x509.X509CertImpl source,它有一些synchronized方法(包括verify)和private ConcurrentHashMap<String,String> fingerprints字段。

所以在我看来,有明确的意图使其成为线程安全的。

不幸的是,更新内部状态字段(如synchronizedverificationResultverifiedPublicKey的{​​{1}}方法会在来自多个线程的并发访问期间产生一些性能开销。

例如,通过缓存verifiedProvider中的实例来避免synchronized锁定争用可能更有效。