|
|
@@ -61,32 +61,37 @@ public abstract class Cache<K,V> {
|
|
|
}
|
|
|
|
|
|
public final V get(K key, Supplier<V> function) {
|
|
|
- Reference<V> ref = getReference(key);
|
|
|
+ Reference<V> ref = iget(key);
|
|
|
if(null == ref) {
|
|
|
cleanup();
|
|
|
- return put(key, function.get());
|
|
|
+ return iput(key, function.get());
|
|
|
}
|
|
|
V ret = ref.get();
|
|
|
if(null == ret) {
|
|
|
cleanup();
|
|
|
- return put(key, function.get());
|
|
|
+ return iput(key, function.get());
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- protected abstract Reference<V> getReference(K key);
|
|
|
+ public final void clear() {
|
|
|
+ iclear();
|
|
|
+ cleanup();
|
|
|
+ }
|
|
|
+
|
|
|
+ protected abstract Reference<V> iget(K key);
|
|
|
|
|
|
- protected abstract V put(K key, V value);
|
|
|
+ protected abstract V iput(K key, V value);
|
|
|
|
|
|
- protected abstract void remove(K key);
|
|
|
+ protected abstract void iremove(K key);
|
|
|
|
|
|
- public abstract void clear();
|
|
|
+ protected abstract void iclear();
|
|
|
|
|
|
protected static void cleanup() {
|
|
|
if(!USE_THREAD) {
|
|
|
KRef ref;
|
|
|
while ( null != (ref = (KRef)QUEUE.poll()) ) {
|
|
|
- ref.src.remove(ref.key);
|
|
|
+ ref.src.iremove(ref.key);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -95,7 +100,7 @@ public abstract class Cache<K,V> {
|
|
|
try {
|
|
|
while (true) {
|
|
|
KRef ref = (KRef) QUEUE.remove();
|
|
|
- ref.src.remove(ref.key);
|
|
|
+ ref.src.iremove(ref.key);
|
|
|
}
|
|
|
} catch (InterruptedException cause) {
|
|
|
// shutdown
|
|
|
@@ -111,25 +116,24 @@ public abstract class Cache<K,V> {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected V put(K key, V value) {
|
|
|
+ protected V iput(K key, V value) {
|
|
|
map.put(key, new KRef<K, V>(this, key, value));
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public Reference<V> getReference(K key) {
|
|
|
+ public Reference<V> iget(K key) {
|
|
|
return map.get(key);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected void remove(K key) {
|
|
|
+ protected void iremove(K key) {
|
|
|
map.remove(key);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void clear() {
|
|
|
+ public void iclear() {
|
|
|
map.clear();
|
|
|
- cleanup();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -143,7 +147,7 @@ public abstract class Cache<K,V> {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected V put(K key, V value) {
|
|
|
+ protected V iput(K key, V value) {
|
|
|
synchronized (map) {
|
|
|
map.put(key, new KRef<K, V>(this, key, value));
|
|
|
}
|
|
|
@@ -151,25 +155,24 @@ public abstract class Cache<K,V> {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public Reference<V> getReference(K key) {
|
|
|
+ public Reference<V> iget(K key) {
|
|
|
synchronized (map) {
|
|
|
return map.get(key);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected void remove(K key) {
|
|
|
+ protected void iremove(K key) {
|
|
|
synchronized (map) {
|
|
|
map.remove(key);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void clear() {
|
|
|
+ public void iclear() {
|
|
|
synchronized (map) {
|
|
|
map.clear();
|
|
|
}
|
|
|
- cleanup();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -185,25 +188,24 @@ public abstract class Cache<K,V> {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected V put(K key, V value) {
|
|
|
+ protected V iput(K key, V value) {
|
|
|
map.put(key, new TRef<K, V>(this, key, value, ttl));
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public Reference<V> getReference(K key) {
|
|
|
+ public Reference<V> iget(K key) {
|
|
|
return map.get(key);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected void remove(K key) {
|
|
|
+ protected void iremove(K key) {
|
|
|
map.remove(key);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void clear() {
|
|
|
+ public void iclear() {
|
|
|
map.clear();
|
|
|
- cleanup();
|
|
|
}
|
|
|
}
|
|
|
|