複数のスレッドが RSA をめぐって争っているという問題が発生しており、javax.crypto.Cipher
スレッドごとに 1 つずつ、暗号のコレクションを保持することを検討しています。ただしCipher.getInstance()
、同じインスタンスが表示されます。を調べる必要がありますか、clone()
またはのようなより良い方法がありnew Cipher()
ますか? synchronized{}
の単一インスタンスを検討して使用しましCipher
たが、遅すぎます。事前にすべての助けをありがとう!
質問する
3843 次
1 に答える
6
異なるスレッドは異なるCipher
インスタンスを取得するように見えます-少なくともMac OSXのJDK 1.6.0_33の下では。これは、BouncyCastle プロバイダーを使用しているためでしょうか?
getInstance()
同じスレッドから 2 回、または別のスレッドから 呼び出そうとしましたか? clone()
Ciphers では利用できないようですので、これはオプションではありません。
次のコードは、少なくとも私にとっては異なる ID ハッシュコード オブジェクトを吐き出しているようです。
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));
...
}
}
于 2012-08-13T21:32:24.527 に答える