mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
optimization: lockfree
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user