2017-11-22 6 views
1

私はここに、いくつかのCALCSを実行クラスの静的メソッドを持っているが、コードスニペットです:マルチスレッドプログラムスレッドのクラスの静的メソッドの実行は安全ですか?

public MyClass { 

MyClass(){} 

public static float runCalcs() 
{ 
    float sum; 
    Float[] floatArray = map.entrySet() 
         .stream() 
         .map(key -> key.getKey().getPrice()) 
         .toArray(size -> new Float[size]); 

    for(int i=0; i<floatArray.length; i++) { 
     sum += floatArray[i]; 
    } 

    return sum; 
} 

} 

私の質問は、私はそうのようなスレッドからこのメソッドを実行すると次のとおりです。

float retVal = MyClass.runCalcs(); 

はこれですスレッドセーフな静的メソッドの実行、またはスレッドセーフなものにするために、MyClass.RunCalcs()を同期またはロックする必要があります。
私のアプリケーションでは、複数のスレッドが同時にこのメソッドを実行します。
私にお知らせください。
事前に感謝!

+7

'map'はどこから来たのですか? –

+1

runCalcs()が実行されている間、他のスレッドによって 'map'(何らかの静的コンテキストが必要)が更新できるかどうかによって異なります。 –

+0

@Andrew S.ありがとうございました – MazS

答えて

3

スレッドセーフは、メソッドやクラスに関する質問ではありません。スレッドの安全性は、共有データに関する質問です。

あるスレッドで実行中のメソッドが、同じメソッドまたは別のスレッドで実行中のほかのメソッドが表示したくない状態に一時的にデータを置くことができる場合、共有データは安全ではありません。

runCalcs()メソッドは、おそらくMapインスタンスで、おそらく他のスレッドと共有されています。mapです。

entrySet()の上でrunCalcs()が繰り返し処理されている間に、他のスレッドがマップの内容を変更する可能性はありますか?もしそうなら、あなたのコードは安全ではありません。それが安全にする

の方法は、反復しながら、runCalcs()がロックをロックに変更し、また、mapを変えながら同じロックをロックするために別のスレッドでmapを更新でき、すべての方法を変更することです。

+0

大変ありがとうございます。はい、マップデータはスレッドによって共有されますが、各スレッドは実行する必要がある作業に関連するデータを除外し、マップ内のオブジェクトを更新します。ロックルートを試してみる – MazS

関連する問題