很简单,一个javax.crypto.Cipher实例(例如Cipher.getInstance("RSA"))是否可以从多个线程使用,或者我是否需要将多个线程放在一个ThreadLocal中(在我的例子中)?
发布于 2011-08-05 21:59:00
不,不是。实例是有状态的。因此,您需要将其存储在线程本地,或者在每次加密/解密调用时获取一个新实例,或者将其包装在synchronized(cipher)块中。
在javadoc中,线程安全通常被称为"is thread safe“或"is thread safe”。Cipher并非如此,因此您不应该假设它是线程安全的。
发布于 2011-08-05 22:06:41
即使Cipher是线程安全的,从多个线程同时使用它也没有什么用处。
您输入和输出的字节(通过它的update和finish方法)是一个连续的流。这意味着,在另一端,它们必须以相同的顺序传递才有意义。如果只有一个线程这样做,这是最容易实现的。
如果你使用多线程,你通常会想要在两次调用之间调用reset --而且无论如何你都需要外部同步。
发布于 2011-08-05 22:01:33
我不会在没有同步的情况下使用来自多个线程的Cipher对象。当您查看API时,有一些方法只能通过更改内部状态才能工作,例如init()和update()。这使得它们隐式地不是线程安全的。
https://stackoverflow.com/questions/6957406
复制相似问题