나는 약 double-checked locking와 약점을 읽었지만, synchronizedMap
을 사용하면 안전하다고 생각하는지 묻습니다.더블 체크 잠금과의 맵 동기화
public class EntityUtils
{
private static final Map<String, Map<String, String>> searchMap = Collections.synchronizedMap(new HashMap<String, Map<String, String>>());
private static Map<String, String> getSearchablePathMap(String key)
{
Map<String, String> pathMap = searchMap.get(key);
if(pathMap != null) return pathMap;
synchronized(searchMap)
{
// double check locking (safe for synchronizedMap?)
pathMap = searchMap.get(key);
if(pathMap != null) return pathMap;
pathMap = new HashMap<>();
pathMap.put(..., ...);
...
// heavy map population operations
...
pathMap = Collections.unmodifiableMap(pathMap);
searchMap.put(key, pathMap);
}
return pathMap;
}
}
제안 또는 개선을 환영합니다 :
여기 내 코드입니다.
두 번째'get()'은 내부 동기화 블록이지만 첫 번째는 바깥입니다. 외부의 threadafe * 객체를 사용하여 ** 손상된 ** Map을 반환 할 수 있으므로'synchronizedMap'은 * 필요합니다 *. 그것이 충분한 지 의심 스럽습니다. –
물론 충분합니다. 요점은 첫 번째'get()'은 (synchronizedMap 때문에) 내부에'synchronized' 블록이 있기 때문에 어떤 성능 이점도주지 않는다는 것입니다. – axtavt
맞아요, 안전하지만 이중 수표가 성능상의 이점을주지는 않습니다. 고맙습니다! –