我遇到了多个线程争夺 RSA javax.crypto.Cipher
的问题,我正在考虑保留一组密码 - 每个线程一个。但是 Cipher.getInstance()
给了我相同的实例。我应该查看 clone()
还是有更好的方法,比如 new Cipher()
?
我们考虑过同步{}
,只使用 Cipher
的单个实例,但它太慢了。
感谢您提前提供的所有帮助!
最佳答案
在我看来,不同的线程获得不同的 Cipher
实例——至少在 Mac OSX 下的 JDK 1.6.0_33 下是这样。也许这是因为我使用的是 BouncyCaSTLe 提供程序?
您是尝试从同一线程还是从不同线程调用 getInstance()
两次? clone()
似乎不适用于 Ciphers,因此这不是一个选项。
一种解决方案是使用 object pools这样多个密码实例将被多个线程并行使用。如果 JDK 在同一线程而不是新实例上返回相同的密码实例,这可能不起作用。
下面的代码似乎至少为我吐出了不同的身份哈希码对象:
private static final ThreadLocal<Cipher> localDigest = new ThreadLocal<Cipher>(){
@Override
protected Cipher initialValue() {
try {
return Cipher.getInstance("RSA");
} catch (Exception e) {
// ugly but necessary
throw new RuntimeException(e);
}
}
};
public static void main(String[] args) {
new Thread(new MyRunnable()).start();
new Thread(new MyRunnable()).start();
}
private static class MyRunnable implements Runnable {
@Override
public void run() {
Cipher cipher = localDigest.get();
System.out.println("Got digest " + System.identityHashCode(cipher));
...
}
}
正如@marius_neo 在评论中指出的那样,ThreadLocal
在某些情况下会导致内存泄漏。请参阅:To Pool or not to Pool java crypto service providers
关于java - 创建和维护多个密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942466/