询问KeyPairGenerator.initialize()
方法需要一个昂贵的初始化SecureRandom
实例。Java Doc没有提到它是否线程安全。我只能在源代码中找到一条注释。它可能取决于实际创建的KeyPairGenerator
实例吗?顺便说一下,我正在使用Sun RSA实例。
询问KeyPairGenerator.initialize()
方法需要一个昂贵的初始化SecureRandom
实例。Java Doc没有提到它是否线程安全。我只能在源代码中找到一条注释。它可能取决于实际创建的KeyPairGenerator
实例吗?顺便说一下,我正在使用Sun RSA实例。
正如您所猜测的那样,它确实取决于实际创建的实例neurite。需要注意的是KeyPairGenerator类是抽象的,而实现其子类则会覆盖generateKeyPair方法。因此,抽象类KeyPairGenerator的作者们无法声称它是线程安全的。他们所能做的就是确保不会破坏线程安全性。
使用静态getInstance方法获取KeyPairGenerator的标准方式将返回从KeyPairGenerator派生的类的实例:请参见KeyPairGenerator.Delegate类。它对generateKeyPair的实现也没有破坏线程安全性,因此如果您以这种方式获取KeyPairGenerator,则没问题†。但您也可以这样获取KeyPairGenerator:
KeyPairGenerator kpg=new KeyPairGenerator("RSA"){
@Override
public KeyPair generateKeyPair(){
return doSomethingThatIsntThreadSafe();
}
};
当然,您肯定不会这样做,但是KeyPairGenerator的作者不知道这一点,因此他们无法告诉您任何KeyPairGenerator实例都是线程安全的。
† 这里的fine是指依赖于您的密码学SPI来正确执行!