3

我有一个 Spring 3 服务方法,我想从中返回一个 PrivateKey/PublicKey keyPair - 将 KeyPairGenerator 作为服务中的实例级变量以避免调用 KeyPairGenerator.getInstance(algo) 并在其中初始化它是否是线程安全的方法调用还是应该将 KeyPairGenerator 保留在服务方法的本地,并为每个方法调用调用 .getInstance(algo) 和 .initialize(...) ,即:

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());
}

第二种方法是否存在并发问题?第一种方法的性能损失是否显着?

4

1 回答 1

4

这个问题实际上与 Spring 无关。我相信你在谈论KeyPairGenerator。JavaDoc 没有说任何关于线程安全的内容,但源代码中有一条注释:

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

好吧,“可能是线程安全的”对我来说绝对没有任何意义,尤其是在查看对 keypairgenerator 的访问可能不是线程安全问题之后:

密钥对生成器的并发属性是特定于 spi 的,可能不是线程安全的。这可能会导致挂起前端的故障。

所以我的建议是在每次调用时创建新实例,或者将它们汇集起来

于 2012-08-31T17:46:44.907 回答