2012-08-31 134 views
3

我有一個Spring 3服務方法,我想返回一個PrivateKey/PublicKey keyPair,它是否是線程安全的,以便將KeyPairGenerator作爲服務中的一個實例級別變量來避免必須調用KeyPairGenerator。的getInstance(ALGO),並對其進行初始化的方法調用,或者我應該保持的KeyPairGenerator本地的服務方法和調用.getInstance(ALGO)和.initialize(...)爲每個方法調用,即:Spring服務方法線程安全

public KeyPair getKeyPair() throws ... { 
    KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance(algo); 
    keyGenerator.initialize(1024); 
    return (keyGenerator.genKeyPair()); 
} 

public KeyPair getKeyPair() throws ... { 
    // use instance level keyGenerator that has been previously initialized 
    return (keyGenerator.genKeyPair()); 
} 

Are there第二種方法可能出現的併發問題?第一種方法的性能損失是否顯着?

+0

順便說一句,你的return語句中的括號是不必要的 –

回答

4

這個問題不是真的與春季有關。我相信你在談論KeyPairGenerator。的Javadoc不是說有關線程安全任何東西,但有一個評論in the source code

// * although not specified, KeyPairGenerators could be thread safe, 
// so we make sure we do not interfere with that 

嘛,「可能是線程安全的」是指絕對沒有對我來說,尤其是在看access to keypairgenerator may not be thread safe發行後:

密鑰對生成器的併發性屬性是spi特有的,可能不是線程安全的。這可能會導致掛起前端的故障。

所以我的建議是在每次調用或創建新實例pool them

+0

感謝您的反饋和鏈接。我在源頭上也看到了這個評論 - 我想這取決於加密提供商的決定,而且合同也沒有保證。我認爲這個問題也是一個Spring相關的問題,因爲如果KeyGenerator可能不是線程安全的,我需要知道默認的@Service註釋類behavoiur(我認爲是Singleton)是否有方法調用的鎖定,或者它們可以同時運行,並且服務內部沒有共享狀態是安全的? – jc1001

+2

@ jc1001:不,沒有同步,多個線程可以運行相同的bean方法。就像EJB一樣,你可以將Spring bean聯合起來,但它有點冒險。 –

+0

感謝Tomasz我會在KeyPairGenerator初始化時間做一些測試,看看它是否保證同步keyGenerator.genKeyPair()周圍的塊,以及是否有任何好處,而不是將它放在服務方法本地。 – jc1001