前述のように、それは間違いなく安全ではありません。マップの内容が getString() のパラメーターに基づいていない場合は、次のように静的イニシャライザーとしてマップを初期化することで、より適切なサービスを提供できます。
private static final Map<Integer, String> MAP = new HashMap<Integer,String>();
static {
// Populate map here
}
上記のコードは、クラスがロードされるときに 1 回呼び出されます。これは完全にスレッド セーフです (ただし、マップへの将来の変更はそうではありません)。パフォーマンス上の理由から遅延ロードしようとしていますか? もしそうなら、これははるかに安全です:
private static Map<Integer, String> map = null;
public synchronized static String getString(int parameter){
if(map == null){
map = new HashMap<Integer, String>();
//map gets filled here...
}
return map.get(parameter);
}
synchronizedキーワードを使用すると、一度に 1 つのスレッドだけがメソッドを実行できるようになり、マップ参照への変更が常に伝達されるようになります。
この質問をしている場合は、「Java Concurrency in Practice」を読むことをお勧めします。