3

私のアプリケーションには 2 つのスレッドがあります。スレッド 1 はスレッド 2 にデータを転送しています。データが転送された後、スレッド 1 のデータはスレッド 2 内でクリアされます。スレッド 1 は、後でスレッド 2 に転送されるデータが入ってくると、HashMap に追加のデータを配置して楽しく進みます。その間、スレッド 2 はデータに対して必要な処理を行います。以下のコードは、スレッド間のデータ転送が発生するスレッド 2 の部分です。アプリケーション全体は問題なく動作しますが、私の質問は、キーワード new を使用してまったく新しいオブジェクトを作成せずに、スレッド 1 のデータのこのコピーをスレッド 2 に作成するより良い方法はありますか?

これを行うと、より多くのガベージコレクションが発生する可能性があると思いますか? これは気にしなくてもいいのでしょうか?

synchronized(this){
    // Make a copy of the data map then clear it.
    cachedData = new HashMap<String,ArrayList<Float>>(data);
    data.clear();
}
4

2 に答える 2

2

なぜだけではないのですか?

    synchronized(this){
        cachedData = data;
        data = new HashMap<String,ArrayList<Float>>();
    }

これはあなたが持っているものと似ていますが、データのコピーは含まれません。

私はあまり心配しませんnew(プロファイリングで問題があることを証明できない限り)。

于 2012-05-04T19:31:13.453 に答える
2

したがって、data HashMap複数のスレッドからこれにアクセスしている場合は、すべてsynchronizedのアクセスでブロックを設定する必要があります。ここでキャッシュされたコピーを取得しているからといって、他のスレッドが同期なしで使用できるようになるわけではありません。data

各使用法を同期HashMap せずにを同時に使用したい場合は、を使用する必要がありConcurrentHashMapます。

アプリケーション全体は問題なく動作しますが、私の質問は、キーワードnewを使用してまったく新しいオブジェクトを作成せずに、スレッド2のスレッド1データのこのコピーを作成するためのより良い方法はありますか?

上記の注意事項を考慮してHashMap、特定のスレッドのコンテンツを操作できるようにスナップショットを撮りたい場合は、言及したパターンが適切であり、よく使用されます。このパターンは、を繰り返してCollectionループ内で変更する必要があるが、を実行しない場合にも使用されますiterator.remove()

キーまたは値だけが必要な場合は、代わりにdata.keySet()またはのコピーを作成してください。data.values()

于 2012-05-04T19:32:26.923 に答える