マルチスレッドがHashMapにアクセスしやすいエラー
2077 ワード
マルチスレッドによるHashMapへのアクセスには、1つのメンバー変数としてインタフェースを介して複数のスレッドによってアクセスされ、1つのスレッドで変更が更新され、リードスレッドとライトスレッドが同じメンバー変数にアクセスし、スレッド間が同期していない場合、データが異常になり、プログラムがクラッシュするというエラーが発生しやすい.スレッド同期によってhashmapの読み書きがシリアルであることを保証しても、あまり良い方法ではありません.1つは、グローバルなロックを使用してスレッド間の反発を保証することです.オーバーヘッドが大きいことです.2つ目は、グローバルロックが読み書きスレッドのブロック待ちをもたらし、体験もよくありません.したがって、hashmapを読み書きするスレッドは、同じhashmapオブジェクトにアクセスしないでください.hashmapを変更するスレッドは、hashmapを更新または変更する必要がある場合に、新しいhashmapオブジェクトを作成し、変更が完了するまでメンバー変数に値を割り当てます.これにより、インタフェースを介してhashmapのスレッドを取得し、アクセスは依然として前のhashmapです.次回の再アクセス時に最新の変更されたhashmapが使用されるため、他のリードスレッドが最新のhashmapではない可能性がありますが、体験的およびオーバーヘッド的には最小です.
hashmapを更新するクラスの説明は次のとおりです.
hashmapを更新するクラスの説明は次のとおりです.
import java.util.HashMap;
public class UpdateThread {
private HashMap mHashMap;
private void updateHashMap(){
new Thread(new Runnable() {
@Override
public void run() {
HashMap hashMap = new HashMap();
// hashmap
hashMap.put("test1", "test1");
// hashmap
mHashMap = hashMap;//
}
}).start();
}
public HashMap getHashMap(){
return mHashMap;
}
}