我有一个类来管理多个功能的锁定对象。我发现 WeakHashMap 应该符合我的要求。这是我的代码:
public static class FeatureLockManager {
private final Map<Object, WeakKeyLockPair> locks;
private String domain;
public FeatureLockManager(String domain) {
this.domain = domain;
locks = new WeakHashMap<Object, WeakKeyLockPair>();
}
public Lock getLock(Object feature) {
if (locks.get(feature) == null) {
synchronized (locks) {
locks.computeIfAbsent(feature, l -> new WeakKeyLockPair(feature, new ReentrantLock()));
}
}
return locks.get(feature);
}
private static class WeakKeyLockPair implements Lock {
private final Reference<Object> feature;
private final Lock lock;
private WeakKeyLockPair(Object feature, Lock lock) {
this.feature = new WeakReference<Object>(feature);
this.lock = lock;
}
... }
}
但是,做了一个简单的测试后,我意识到锁对象在GC之后不会被删除。
public static void main(String[] args) throws InterruptedException {
FeatureLockManager test = new FeatureLockManager("test");
Lock lock = test.getLock("add user");
System.out.println(lock.hashCode());
// do thing
System.gc();
Thread.sleep(1000);
Lock lock1 = test.getLock("add user");
System.out.println(lock1.hashCode());
System.out.println(lock1 == lock);
}
你能告诉我我的实施有什么问题吗?先感谢您!