java - Spring服务方法线程安全

标签 java service concurrency

我有一个 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());
}

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

最佳答案

这个问题与 Spring 无关。我相信你在谈论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 之后问题:

the concurrency properties of the key pair generator are spi specific and may not be thread safe. this can cause failures which hang the front end.

所以我的建议是在每次调用时创建新实例,或者 pool them .

关于java - Spring服务方法线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12219986/

相关文章:

java - 重用执行异步代码并回发到 UI 线程的代码

c# - 以不同用户身份从 .NET 服务启动 .NET 应用程序时出现权限问题?

service - 在 liferay 主题(速度模板)中使用自定义服务或 liferay 服务?

java - 避免同一缓存区域的多次重新填充(由于并发)

go - 确保 goroutine 清理,最佳实践

java - 带有 Select Query 的 Jooq AddCondition 方法

java - 使用Java.io.*读取文件

java - 如何响应鼠标点击形状

java - Service 如何与其 Activity 通信?服务如何调用启动该服务的 Activity 中的方法?

java - 如何对有界缓冲区实现同步检查以避免竞争条件?