3

我遇到了一个问题,即多个线程正在争夺 RSA javax.crypto.Cipher,我正在考虑保留一组密码 - 每个线程一个。但是Cipher.getInstance()给了我同样的例子。我应该研究 aclone()还是有更好的方法,比如 a new Cipher()?我们已经考虑过synchronized{}并且只使用单个实例,Cipher但它太慢了。感谢您提前提供的所有帮助!

4

1 回答 1

6

在我看来,不同的线程得到不同的Cipher实例——至少在 Mac OSX 下的 JDK 1.6.0_33 下。也许这是因为我正在使用 BouncyCastle 提供程序?

您是尝试getInstance()从同一个线程调用两次还是从不同的线程调用? clone()Ciphers 似乎不可用,所以这不是一个选项。

以下代码似乎至少为我吐出了不同的身份哈希码对象:

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 回答