Javaでスレッドと同期がどのように機能するかを説明してもらえますか?
高性能なアプリケーションを書きたいです。このアプリケーション内で、ファイルからいくつかのネストされたクラスにデータを読み取ります。これらは基本的にHashMapの基本です。
データの読み取りが終了した後、データを調べてさまざまなチェックを実行する必要があるスレッドを開始します。ただし、スレッドがデータを変更することはありません。
スレッドがデータを変更しないことを保証できる(または少なくとも保証しようとする)場合、データを含むオブジェクトの非同期メソッドを呼び出すためにそれらを使用できますか?
複数のスレッドが、クラスフィールドを変更しないが、いくつかの内部変数を持つ非同期メソッドにアクセスする場合、それは安全ですか?
人工的な例:
public class Data{
// this hash map is filled before I start threads
protected Map<Integer, Spike> allSpikes = new HashMap<Integer, Spike>();
public HashMap returnBigSpikes(){
Map<Integer, Spike> bigSpikes = new HashMap<Integer, Spike>();
for (Integer i: allSpikes.keySet()){
if (allSpikes.get(i).spikeSize > 100){
bigSpikes.put(i,allSpikes.get(i));
}
}
return bigSpikes;
}
}
スレッドから非同期メソッドreturnBigSpikes()を呼び出しても安全ですか?
このようなユースケースは、制御が難しく、データ(たとえば、返されたbigSpikes)が変更されないため、潜在的に非常に危険であることがわかりました。しかし、私はすでにこのように実装してテストしており、アプリケーションの結果を今すぐ使用して、後でアーキテクチャを変更できるかどうかを知りたいです...
メソッドを同期させるとどうなりますか?アプリケーションのCPUパフォーマンスが1に低下しますか?もしそうなら、どうすればそれを正しく設計し、パフォーマンスを維持できますか?
(メインメモリに約20〜40 Gbのデータ(ログメッセージ)を読み込んでからスレッドを実行します。スレッドはすべてのデータを調べて相関関係を見つける必要があります。各スレッドは分析するメッセージの一部にすぎません。分析のために、スレッドはその部分からの各メッセージをデータからの他の多くのメッセージと比較する必要があります。そのため、スレッドが同期せずにデータを読み取ることを最初に許可することにしました)。
事前にどうもありがとうございました。