3

複数のスレッドが RSA をめぐって争っているという問題が発生しており、javax.crypto.Cipherスレッドごとに 1 つずつ、暗号のコレクションを保持することを検討しています。ただしCipher.getInstance()、同じインスタンスが表示されます。を調べる必要がありますか、clone()またはのようなより良い方法がありnew Cipher()ますか? synchronized{}の単一インスタンスを検討して使用しましCipherたが、遅すぎます。事前にすべての助けをありがとう!

4

1 に答える 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 に答える