samples/deadlock/src/org/apidesign/javamonitorflaws/Cache.java
changeset 315 08dd52950883
child 316 41a4abecb600
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/samples/deadlock/src/org/apidesign/javamonitorflaws/Cache.java	Tue Feb 10 18:36:21 2009 +0100
     1.3 @@ -0,0 +1,40 @@
     1.4 +package org.apidesign.javamonitorflaws;
     1.5 +
     1.6 +import java.util.HashMap;
     1.7 +import java.util.Map;
     1.8 +
     1.9 +/**
    1.10 + *
    1.11 + * @author Jaroslav Tulach <jtulach@netbeans.org>
    1.12 + */
    1.13 +public abstract class Cache<From,To> {
    1.14 +    private Map<From,To> cache;
    1.15 +
    1.16 +    public final To get(From f) {
    1.17 +        for (;;) {
    1.18 +            synchronized (this) {
    1.19 +                if (cache == null) {
    1.20 +                    cache = new HashMap<From, To>();
    1.21 +                }
    1.22 +                To t = cache.get(f);
    1.23 +                if (t != null) {
    1.24 +                    return t;
    1.25 +                }
    1.26 +            }
    1.27 +
    1.28 +            To newT = createItem(f);
    1.29 +
    1.30 +            synchronized (this) {
    1.31 +                To t = cache.get(f);
    1.32 +                if (t == null) {
    1.33 +                    cache.put(f, newT);
    1.34 +                    return newT;
    1.35 +                } else {
    1.36 +                    return t;
    1.37 +                }
    1.38 +            }
    1.39 +        }
    1.40 +    }
    1.41 +
    1.42 +    protected abstract To createItem(From f);
    1.43 +}