커먼즈 컬렉션 LRUMap (기본으로 작은 수정이있는 LinkedHashMap)을 사용하여 사용자의 사진을위한 LRU 캐시를 구현하고 있습니다. findPhoto 메서드는 몇 초 내에 수백 번 호출 될 수 있습니다.다중 스레드 환경에서이 캐시 맵 사용이 안전합니까?
public class CacheHandler {
private static final int MAX_ENTRIES = 1000;
private static Map<Long, Photo> photoCache = Collections.synchronizedMap(new LRUMap(MAX_ENTRIES));
public static Map<Long, Photo> getPhotoCache() {
return photoCache;
}
}
사용법 : 당신은 내가 동기화 블록을 사용하지 않는 볼 수 있듯이
public Photo findPhoto(Long userId){
User user = userDAO.find(userId);
if (user != null) {
Map<Long, Photo> cache = CacheHandler.getPhotoCache();
Photo photo = cache.get(userId);
if(photo == null){
if (user.isFromAD()) {
try {
photo = LDAPService.getInstance().getPhoto(user.getLogin());
} catch (LDAPSearchException e) {
throw new EJBException(e);
}
} else {
log.debug("Fetching photo from DB for external user: " + user.getLogin());
UserFile file = userDAO.findUserFile(user.getPhotoId());
if (file != null) {
photo = new Photo(file.getFilename(), "image/png", file.getFileData());
}
}
cache.put(userId, photo);
}else{
log.debug("Fetching photo from cache, user: " + user.getLogin());
}
return photo;
}else{
return null;
}
}
. 나는 최악의 경우의 시나리오가 두 userId에 대해 cache.put (userId, photo)를 실행하게하는 경합 조건이라고 가정하고있다. 그러나 데이터는 두 스레드에서 동일하므로 문제는되지 않습니다.
내 이유는 정확합니까? 그렇지 않은 경우 큰 성능이 저하되지 않으면 서 동기화 블록을 사용할 수 있습니까? 한 번에 하나의 스레드 만지도에 액세스하면 과도한 느낌이납니다.
아이디어를 주셔서 감사합니다. 매우 교육적입니다. –