samples/deadlock/src/org/apidesign/javamonitorflaws/Cache.java
author Jaroslav Tulach <jtulach@netbeans.org>
Wed, 11 Feb 2009 07:12:41 +0100
changeset 316 41a4abecb600
parent 315 08dd52950883
child 317 e101649dbd17
permissions -rw-r--r--
Rewritten to rely on (private) synchronized methods
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@316
     6
/** Classical caching support class that makes sure there is
jtulach@316
     7
 * always one "To" value for each "From" one returned from the {@link #get}
jtulach@316
     8
 * method. However it does not prevent multiple threads to call
jtulach@316
     9
 * {@link #createItem} multiple times for the same "From" value.
jtulach@316
    10
 * <p>
jtulach@316
    11
 *
jtulach@315
    12
 *
jtulach@315
    13
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jtulach@315
    14
 */
jtulach@315
    15
public abstract class Cache<From,To> {
jtulach@315
    16
    private Map<From,To> cache;
jtulach@315
    17
jtulach@316
    18
    protected abstract To createItem(From f);
jtulach@316
    19
jtulach@315
    20
    public final To get(From f) {
jtulach@316
    21
        To t = inspectValue(f);
jtulach@316
    22
        if (t != null) {
jtulach@316
    23
            return t;
jtulach@316
    24
        }
jtulach@316
    25
        To newT = createItem(f);
jtulach@316
    26
        return registerValue(f, newT);
jtulach@316
    27
    }
jtulach@315
    28
jtulach@315
    29
jtulach@316
    30
    private synchronized To inspectValue(From f) {
jtulach@316
    31
        if (cache == null) {
jtulach@316
    32
            cache = new HashMap<From, To>();
jtulach@316
    33
        }
jtulach@316
    34
        return cache.get(f);
jtulach@316
    35
    }
jtulach@316
    36
jtulach@316
    37
    private synchronized To registerValue(From f, To newT) {
jtulach@316
    38
        To t = cache.get(f);
jtulach@316
    39
        if (t == null) {
jtulach@316
    40
            cache.put(f, newT);
jtulach@316
    41
            return newT;
jtulach@316
    42
        } else {
jtulach@316
    43
            return t;
jtulach@315
    44
        }
jtulach@315
    45
    }
jtulach@315
    46
}