samples/deadlock/src/org/apidesign/javamonitorflaws/Cache.java
author Jaroslav Tulach <jtulach@netbeans.org>
Tue, 10 Feb 2009 18:36:21 +0100
changeset 315 08dd52950883
child 316 41a4abecb600
permissions -rw-r--r--
Example for the "java monitor pitfalls" chapter
jtulach@315
     1
package org.apidesign.javamonitorflaws;
jtulach@315
     2
jtulach@315
     3
import java.util.HashMap;
jtulach@315
     4
import java.util.Map;
jtulach@315
     5
jtulach@315
     6
/**
jtulach@315
     7
 *
jtulach@315
     8
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jtulach@315
     9
 */
jtulach@315
    10
public abstract class Cache<From,To> {
jtulach@315
    11
    private Map<From,To> cache;
jtulach@315
    12
jtulach@315
    13
    public final To get(From f) {
jtulach@315
    14
        for (;;) {
jtulach@315
    15
            synchronized (this) {
jtulach@315
    16
                if (cache == null) {
jtulach@315
    17
                    cache = new HashMap<From, To>();
jtulach@315
    18
                }
jtulach@315
    19
                To t = cache.get(f);
jtulach@315
    20
                if (t != null) {
jtulach@315
    21
                    return t;
jtulach@315
    22
                }
jtulach@315
    23
            }
jtulach@315
    24
jtulach@315
    25
            To newT = createItem(f);
jtulach@315
    26
jtulach@315
    27
            synchronized (this) {
jtulach@315
    28
                To t = cache.get(f);
jtulach@315
    29
                if (t == null) {
jtulach@315
    30
                    cache.put(f, newT);
jtulach@315
    31
                    return newT;
jtulach@315
    32
                } else {
jtulach@315
    33
                    return t;
jtulach@315
    34
                }
jtulach@315
    35
            }
jtulach@315
    36
        }
jtulach@315
    37
    }
jtulach@315
    38
jtulach@315
    39
    protected abstract To createItem(From f);
jtulach@315
    40
}