密码线程安全吗?
很简单, javax.crypto.Cipher
(例如Cipher.getInstance("RSA")
)的一个实例可以从多个线程中使用,还是我需要将它们中的多个保存在ThreadLocal
(在我的情况下)?
不,不是的。 该实例是有状态的。 因此,您需要将其存储在threadlocal中,或者在每个encryption/解密调用中获取新实例,或者将其包装在synchronized(cipher)
块中。
Threadsafety通常在javadoc中被明确提及。 Cipher
不是这种情况,所以你不应该认为它是线程安全的。
即使密码是线程安全的,从多个线程同时使用它也没有多大用处。
你input和输出密码的字节(通过它的update
和finish
方法)是一个连续的stream。 这意味着,另一方面,它们必须以相同的顺序通过才能有意义。 如果你只有一个线程这样做,这是最容易完成的。
如果你正在使用多个线程,你通常会想调用reset
调用之间的reset
– 然后你需要外部同步。
我不会使用multithreading密码对象没有同步。 当您查看API时,有些方法只能通过更改内部状态(如init()
和update()
。 这使得它们隐含的非线程安全。