/** * Internal, thread-safe method for loading result into cache. * * @param key The key. * @return The associated value. */ private VALUE internalGet(KEY key) { CachedObject<VALUE> cachedObject; boolean needsFetch; synchronized (map) { needsFetch = !map.containsKey(key); if (needsFetch) { cachedObject = new CachedObject<VALUE>(); map.put(key, cachedObject); } else { cachedObject = map.get(key); } } if (needsFetch) { try { cachedObject.setObject(fetch(key)); } catch (Throwable e) { RuntimeException e2 = MiscUtil.toUnchecked(e); cachedObject.setException(e2); throw e2; } } return cachedObject.getObject(); }