参加している分散プログラミングコース用のJavaWebサービスサーバーの開発を終えたところです。要件の1つは、プロジェクトのマルチスレッドセーフを保証することでした。そのため、ConcurrentHashMapオブジェクトを使用してデータを保存することにしました。最後に、このコードスニペットに関する質問が残ります。
public List<THost> getHList() throws ClusterUnavailable_Exception{
logger.entering(logger.getName(), "getHList");
if(hMap==null){
synchronized(this){
if(hMap==null){
hMap=createHMap();
}
}
}
if(hMap==null){
ClusterUnavailable cu = new ClusterUnavailable();
cu.setMessage("Data unavailable.");
ClusterUnavailable_Exception exc = new ClusterUnavailable_Exception("Data unavailable.", new ClusterUnavailable());
throw exc;
}
else{
List<THost> hList = new ArrayList<THost>(hMap.values());
logger.info("Returning list of hosts. Number of hosts returned = "+hList.size());
logger.exiting(logger.getName(), "getHList");
return hList;
}
}
マルチスレッド環境でサービスが予測できない動作をしないことを保証するために、concurrenthashmapオブジェクト自体を作成するときにsynchronizedステートメントを使用する必要がありますか?