author | Jaroslav Tulach <jtulach@netbeans.org> |
Tue, 10 Feb 2009 18:36:21 +0100 | |
changeset 315 | 08dd52950883 |
child 316 | 41a4abecb600 |
permissions | -rw-r--r-- |
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 |
} |