0

ConcurrentHashMap のドキュメントから:

取得の完全な同時実行性と更新の調整可能な予想同時実行性をサポートするハッシュ テーブル。

ConcurrentHashMapそれがスレッドセーフな操作を行うと完全に信じることができますか?

キーと値のマッピングに ConcurrentHashMap を使用しています。キーと値のペアは次のとおりです。

Map<Integer,ArrayList<Double>> map1 = new ConcurrentHashMap();

キーのサイズの範囲は [0,1000000] です。一度にキーに対応する値にアクセス/変更できる20個のスレッドがあります。これはそれほど頻繁ではありませんが、その状態が発生する可能性があります。次のメソッドから無限大を取得しています:

Double sum =0.0; 
sum = sum + Math.exp(getScore(contextFeatureVector,entry.getValue())+constant);

contextFeatureVectorキーに entry.getValue()関連付けられた配列リストです。

[編集]

 constant =0.0001

private double getScore(List<Double> featureVector,List<Double>weightVector) throws NullPointerException    
{
    double score =0.0;
    int length = featureVector.size();
    for (int i =0 ; i< length ; i++){
    score = score + (featureVector.get(i)*weightVector.get(i)); 
    }

    return score;
}

両方featureVector<> and weightVector looks like

[-0.005554038592516575, 0.0048966974158881175, -0.05315976588195846, -0.030837804373964654, 0.014483064988148562, -0.018962129117649, -0.015221386014208877, 0.015825702365331477, -0.11363620479662287, 0.00802609847263844, -0.062106636476812194, 0.008108854471293185, -0.03193255218671684, 0.04949650992670292, -0.0545583154094599, -0.04873314092706468, 0.013534731656877033, 0.08433117163682455, 0.050310355477044114, -0.002420513353516017, -0.02708299928442614, -0.023489187394176294, -0.1277699782685597, -0.10071004855129333, 0.08649040730064464, -0.04940329664431305, -0.027481729446035053, -0.0571846057609884, -0.036738550618481455, -0.035608113682344365]

したがって、getScore から返される値が極端に大きくなりすぎることはありません。数千単位になります。

4

4 に答える 4

3

スレッドセーフですが、スレッドセーフではない方法で使用できます。

10 年以上使用されている JDK ライブラリにバグがあると判断できるほど、問題を十分に調査していないのではないかと思います。

于 2012-07-22T11:44:57.890 に答える
3

あなたが使用しているデータ構造は、あなたのコードに何らかのバグがあるに違いないと私に思わせます。ほとんどの場合、マップからリストを取得して更新しています。

map1.get(42).add(5);

通常の で動作するため、スレッドセーフでadd(5)ないことに注意してくださいArrayListArrayListスレッドセーフまたはreplace(K key, V oldValue, V newValue)メソッドが必要です。

保証書をよくお読みいただければConcurrentHashMap、有効にご利用いただけます。

于 2012-07-22T11:46:54.447 に答える
2

Math.exp(...)大きすぎる入力を呼び出すと、Infinity が得られます。それがおそらくあなたの問題の原因です...スレッドセーフに関する想像上の問題ではありません。

トレースコードを追加して、何が何であるかを確認することをお勧めします

 getScore(contextFeatureVector, entry.getValue())

sumインフィニティになると戻ってきます。それを超えて、あなたのコードをもっと見ることなく、私たちが助けることができるとは思いません.

于 2012-07-22T11:52:31.970 に答える
1

Java に格納できる最大数doubleは約exp(709)です。したがって、709 より大きい値を に渡すexp()と、算術オーバーフローが発生することが予想されます。

于 2012-07-22T12:10:53.637 に答える