3

PrivateKey/PublicKey keyPair を返したい Spring 3 サービス メソッドがあります。KeyPairGenerator.getInstance(algo) を呼び出して初期化する必要がないように、KeyPairGenerator をサービスのインスタンス レベル変数として持つことはスレッド セーフですか。メソッド呼び出しまたは KeyPairGenerator をサービス メソッドに対してローカルに保持し、メソッド呼び出しごとに .getInstance(algo) および .initialize(...) を呼び出す必要があります。

public KeyPair getKeyPair() throws ... {
    KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance(algo);
    keyGenerator.initialize(1024);
    return (keyGenerator.genKeyPair());
}

また

public KeyPair getKeyPair() throws ... {
    // use instance level keyGenerator that has been previously initialized
    return (keyGenerator.genKeyPair());
}

2 番目のアプローチで同時実行の問題が発生する可能性はありますか? 最初のアプローチでは、パフォーマンスが大幅に低下しますか?

4

1 に答える 1

4

この質問は実際には Spring 関連ではありません。について話していると思いますKeyPairGenerator。JavaDoc はスレッド セーフについて何も述べていませんが、ソース コードにコメントがあります。

//  * although not specified, KeyPairGenerators could be thread safe,
//    so we make sure we do not interfere with that

まあ、「スレッドセーフになる可能性があります」は、特にkeypairgeneratorへのアクセスを調べた後では、スレッドセーフな問題ではない可能性があるため、私にはまったく意味がありません。

キー ペア ジェネレーターの同時実行プロパティは spi 固有であり、スレッド セーフではない場合があります。これにより、フロントエンドがハングする障害が発生する可能性があります。

したがって、私のアドバイスは、すべての呼び出しで新しいインスタンスを作成するか、それらをプールすることです。

于 2012-08-31T17:46:44.907 に答える