通常,java.security.cert.Certificate中的验证方法是否可以被视为线程安全的?具体而言,verify(PublicKey key)和verify(PublicKey key, String sigProvider)。多个线程可以同时调用这些方法而不必担心它们会以线程不安全的方式修改内部数据吗?
JavaDoc没有提及任何相关内容。也许这是特定于实现的?
我想做这样的事情:
Certificate certificate = getCertificateFromCache();
certificate.verify(whatever);
理想情况下,不要将其放在同步块中。
答案 0 :(得分:3)
Certificate.verify
是一种抽象方法。因此,从这个角度来看,无法保证所有实现始终是线程安全的。也许实际证书实现的文档会告诉您一些相关信息,但为了安全起见,您可能必须同步调用以验证实际证书。
也许您可以创建类似于相同证书实例池的东西来绕过该问题。然后,您可以在同一证书的不同实例上并行验证。
答案 1 :(得分:0)
查看sun.security.x509.X509CertImpl
source,它有一些synchronized
方法(包括verify
)和private ConcurrentHashMap<String,String> fingerprints
字段。
所以在我看来,有明确的意图使其成为线程安全的。
不幸的是,更新内部状态字段(如synchronized
,verificationResult
,verifiedPublicKey
的{{1}}方法会在来自多个线程的并发访问期间产生一些性能开销。
例如,通过缓存verifiedProvider
中的实例来避免synchronized
锁定争用可能更有效。