optimization: lockfree

This commit is contained in:
Alexey Kudravtsev
2011-04-06 12:05:29 +04:00
parent 8650883ee2
commit b2c56292fb
2 changed files with 18 additions and 3 deletions
@@ -30,7 +30,7 @@ public abstract class FieldCache<T, Owner,AccessorParameter,Parameter> {
w = ourLock.writeLock();
}
public final T get(AccessorParameter a, Owner owner, Parameter p) {
public T get(AccessorParameter a, Owner owner, Parameter p) {
r.lock();
T result;
try {
@@ -68,7 +68,7 @@ public abstract class FieldCache<T, Owner,AccessorParameter,Parameter> {
}
}
public final void clear(AccessorParameter a, Owner owner) {
public void clear(AccessorParameter a, Owner owner) {
w.lock();
try {
putValue(null, owner, a);
@@ -81,4 +81,4 @@ public abstract class FieldCache<T, Owner,AccessorParameter,Parameter> {
protected abstract T compute(Owner owner, Parameter p);
protected abstract T getValue(Owner owner, AccessorParameter p);
protected abstract void putValue(T t, Owner owner, AccessorParameter p);
}
}
@@ -44,4 +44,19 @@ public abstract class UserDataCache<T, Owner extends UserDataHolder, Param> exte
protected final void putValue(final T t, final Owner owner, final Key<T> key) {
owner.putUserData(key, t);
}
@Override
public T get(Key<T> a, Owner owner, Param p) {
T value = owner.getUserData(a);
if (value == null) {
value = compute(owner, p);
value = ((UserDataHolderEx)owner).putUserDataIfAbsent(a, value);
}
return value;
}
@Override
public void clear(Key<T> key, Owner owner) {
owner.putUserData(key, null);
}
}