- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道我是否可以实例化 javax.crypto.KeyGenerator仅一次,然后在多线程环境中使用此实例。
它的 JavaDoc 文档没有说明它的线程安全性。或者使用 ThreadLocal<KeyGenerator>
会更好方法?
更新:一个相关的问题是 Is SecureRandom thread safe?虽然 JavaDoc 没有声明该类是线程安全的,但社区仍然认为它是线程安全的决定从实践的角度来看非常重要。我想知道 KeyProvider 的情况。
最佳答案
除非文档明确保证线程安全,否则将任何事物视为非线程安全。
你是对的,这种哲学对线程安全文档的稀缺性几乎没有帮助......但是如果没有保证线程安全的文档,那么你就不能假设某些东西是或将继续是 线程安全。
这是对 KeyGenerator
的实际实现的一些研究,以及为什么我们不能假设它是线程安全的
我找到了 the source乍一看,当前的实现似乎是线程安全的。然而,即使我们假设这个实现永远不会改变,它也会调用Security Providers
,这可能是他们自己的任何实现,也不能保证是线程安全的,因为文档对此只字不提。
来源摘要:
调用 generateKey()
使用“ key 生成器服务提供者”调用 KeyGeneratorSpi.engineGenerateKey()
(这可能是线程不安全的) 生成 SecretKey
。
如果您使用特定的提供程序构造 KeyGenerator
,那么它将使用该特定的提供程序来生成 key 。
如果您没有使用特定提供程序构造 KeyGenerator
,则 nextSpi()
将迭代(线程安全)可用提供程序的 JVM 列表并尝试生成 key 直到一个有效或您用完供应商..
要点是文档...如果文档没有提到线程安全,那么任何当前的实现者或对当前实现的更新可能不是线程安全的。
因此,您根本无法假设或依赖 KeyGenerator
的任何线程安全性。
关于java - KeyGenerator 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47678634/
我是一名优秀的程序员,十分优秀!