jtulach@315: package org.apidesign.javamonitorflaws; jtulach@315: jtulach@315: import java.util.HashMap; jtulach@315: import java.util.Map; jtulach@315: jtulach@315: /** jtulach@315: * jtulach@315: * @author Jaroslav Tulach jtulach@315: */ jtulach@315: public abstract class Cache { jtulach@315: private Map cache; jtulach@315: jtulach@315: public final To get(From f) { jtulach@315: for (;;) { jtulach@315: synchronized (this) { jtulach@315: if (cache == null) { jtulach@315: cache = new HashMap(); jtulach@315: } jtulach@315: To t = cache.get(f); jtulach@315: if (t != null) { jtulach@315: return t; jtulach@315: } jtulach@315: } jtulach@315: jtulach@315: To newT = createItem(f); jtulach@315: jtulach@315: synchronized (this) { jtulach@315: To t = cache.get(f); jtulach@315: if (t == null) { jtulach@315: cache.put(f, newT); jtulach@315: return newT; jtulach@315: } else { jtulach@315: return t; jtulach@315: } jtulach@315: } jtulach@315: } jtulach@315: } jtulach@315: jtulach@315: protected abstract To createItem(From f); jtulach@315: }