KeyGenerator线程安全吗?

And*_*niy 6 java multithreading cryptography thread-safety

我想知道我是否只能实例化javax.crypto.KeyGenerator一次,然后在多线程环境中使用此实例.

它的JavaDoc文档没有说明它的线程安全性.或者使用ThreadLocal<KeyGenerator>方法会更好?

更新:一个相关的问题是SecureRandom线程是否安全? 虽然JavaDoc没有声明该类是线程安全的,但是社区仍然认为它线程安全的,从实际的角度来看这是非常重要的.我想知道KeyProvider的相同内容.

xtr*_*tic 6

除非文档明确保证线程安全,否则将任何内容视为不是线程安全的.

你是对的这个哲学对于线程安全文档的稀缺性几乎没有帮助......但是如果没有文档保证线程安全,那么你根本就不能假设某些东西是或将继续是线程安全的.


这里有一些关于实际实现的研究KeyGenerator以及为什么我们不能假设它是线程安全的

我找到了源代码,乍看之下,当前的实现似乎是线程安全的.但是,即使我们假设这个实现永远不会改变,它也可以调用Security Providers它们自己的任何实现,也不能保证是线程安全的,因为文档没有说明它.


来源摘要:

调用generateKey()使用"Key Generator Service Provider"调用KeyGeneratorSpi.engineGenerateKey() (可能是线程不安全的)来生成SecretKey.

如果您KeyGenerator使用特定提供程序tehn构建它,它将使用该特定提供程序生成密钥.

如果您没有KeyGenerator使用特定提供程序构造,那么nextSpi()将通过JVMs可用提供程序列表进行迭代(线程安全),并尝试生成密钥,直到一个工作或您用完提供程序.


重点是文档 ......如果文档没有提及线程安全性,那么任何当前的实现者或对当前实现的更新可能都不是线程安全的.

所以你根本无法假设或依赖任何线程安全KeyGenerator.

  • +1为彻底的答案,但你做了太多的工作!你原来较短的答案是正确的.当前实现可能是线程安全的也可能不是线程安全的事实是无关紧要的.实施可以在明天改变,唯一的行为保证是Javadocs中给出的. (3认同)
  • @Andremoniy这个正确答案的重点是你需要线程*安全*的证据,并且在*文档中,*除非你找到它,否则你不应该假设它. (3认同)