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
     1 package org.apidesign.javamonitorflaws;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 /**
     7  *
     8  * @author Jaroslav Tulach <jtulach@netbeans.org>
     9  */
    10 public abstract class Cache<From,To> {
    11     private Map<From,To> cache;
    12 
    13     public final To get(From f) {
    14         for (;;) {
    15             synchronized (this) {
    16                 if (cache == null) {
    17                     cache = new HashMap<From, To>();
    18                 }
    19                 To t = cache.get(f);
    20                 if (t != null) {
    21                     return t;
    22                 }
    23             }
    24 
    25             To newT = createItem(f);
    26 
    27             synchronized (this) {
    28                 To t = cache.get(f);
    29                 if (t == null) {
    30                     cache.put(f, newT);
    31                     return newT;
    32                 } else {
    33                     return t;
    34                 }
    35             }
    36         }
    37     }
    38 
    39     protected abstract To createItem(From f);
    40 }