-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathWeakCache.java
More file actions
49 lines (41 loc) · 1.41 KB
/
WeakCache.java
File metadata and controls
49 lines (41 loc) · 1.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package roj.collect;
import roj.reflect.Unsafe;
import roj.util.Helpers;
import roj.util.NativeMemory;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.Objects;
/**
* 这是一个特制的类似WeakHashMap的map,更省内存
* 甚至支持自动清除被回收的项目,即便自身不被访问
* @author Roj234
* @since 2021/5/27 0:8
*/
public class WeakCache<K> extends WeakReference<K> implements Runnable {
public WeakCache(K key, XashMap<K, ? extends WeakCache<K>> owner) {
super(key, null);
this.owner = Objects.requireNonNull(Helpers.cast(owner));
this.hash = System.identityHashCode(key);
cleanerRef = NativeMemory.createCleaner(key, this);
}
protected final XashMap<K, WeakCache<K>> owner;
final int hash;
final Object cleanerRef;
public void destroy() {
NativeMemory.invokeClean(cleanerRef);
}
private WeakCache<K> _next;
@Override
public void run() {
try {
synchronized (owner) {owner.removeInternal(this, hash);}
} catch (Throwable e) {
e.printStackTrace();
}
}
private static final long _NEXT = Unsafe.objectFieldOffset(WeakCache.class, "_next", WeakCache.class);
private static final long REFERENT = Unsafe.objectFieldOffset(Reference.class, "referent", Object.class);
public static <K, V extends WeakCache<K>> XashMap.Template<K, V> shape(Class<V> vType) {
return new XashMap.Template<>(vType, _NEXT, REFERENT, Hasher.identity(), null);
}
}