2011-05-19 66 views
3

通常,java.security.cert.Certificate中的驗證方法是否可以被認爲是線程安全的?具體而言,verify(PublicKey key)verify(PublicKey key, String sigProvider)。多個線程可以同時調用這些方法,而不用擔心它們會以線程不安全的方式修改內部數據?java.security.cert.Certificate中的驗證方法是否線程安全?

JavaDoc沒有提到任何關於此的內容。也許這是具體實現?

我願做這樣的事情:

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

理想的情況下沒有把它在一個synchronized塊。

+0

您最關心的是什麼? 'verify'不應該改變證書,所以同時調用相同證書上的同一個方法不應該導致問題! – 2011-05-19 07:15:28

+0

這正是我所問:方法線程安全嗎?有沒有保證調用不會以線程不安全的方式修改內部數據? – Vetle 2011-05-19 07:19:09

回答

3

Certificate.verify是一種抽象方法。所以從這個角度來看,並不能保證所有的實現都是線程安全的。也許實際證書實現的文檔告訴你一些關於它的信息,但爲了安全起見,你可能需要同步調用來驗證實際證書。

也許你可以創建類似於證書實例池的東西來繞過該問題。然後,您可以並行驗證相同證書的不同實例。

+0

這就是我所害怕的。看不到任何理由,它不是線程安全的,但不可能知道它是如何實現的。 – Vetle 2011-05-19 19:44:52

0

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

因此,在我看來,有一個明確的意圖,使其線程安全。

不幸的是​​方法更新內部狀態領域,如verificationResultverifiedPublicKeyverifiedProvider會從多個線程併發訪問期間招致一些性能開銷。

例如,通過緩存ThreadLocal中的實例來避免​​鎖爭用可能更有效。