複数のスレッドから同時にアクセスできるマップを持つシングルトンクラスがあります。誰かが以下のコードをチェックして、そのスレッドが安全かどうか教えてもらえますか?(注:ConcurrentHashMapを使用する予定はなく、printMapメソッドが呼び出されることはめったにありません。)
public class MySingleton{
private Map<String,String> cache = Collections.synchronizedMap(
new LinkedHashMap<String,String>());
public String getValue(String key){
return cache.get(key)
}
public void setValue(String key, String value){
cache.put(key, value);
}
public void printMap(){
synchronized(cache){
for(Entry<String,String> entry: cache.entrySet()){
println('key: '+entry.getKey()+', value: ' + value);
}
}
}
}
私のテストは機能しています...しかし、このコードが「スレッドセーフ」と呼ばれるのに十分かどうか疑問です。
私が考えたポイント:
私はsynchronizedMapを使用しているので、readValueメソッドとputValueメソッドには「synchronized」ブロックは必要ありません。
のjavadocは、各反復の前にMapインスタンスを同期する必要があると述べているため、printMapには同期ブロックが必要です。 http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29
どんな助けでも大歓迎です。