マルチスレッドがHashMapにアクセスしやすいエラー

2077 ワード

マルチスレッドによるHashMapへのアクセスには、1つのメンバー変数としてインタフェースを介して複数のスレッドによってアクセスされ、1つのスレッドで変更が更新され、リードスレッドとライトスレッドが同じメンバー変数にアクセスし、スレッド間が同期していない場合、データが異常になり、プログラムがクラッシュするというエラーが発生しやすい.スレッド同期によってhashmapの読み書きがシリアルであることを保証しても、あまり良い方法ではありません.1つは、グローバルなロックを使用してスレッド間の反発を保証することです.オーバーヘッドが大きいことです.2つ目は、グローバルロックが読み書きスレッドのブロック待ちをもたらし、体験もよくありません.したがって、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;
    }

}