我正在创建一个同时执行方法的接口,同时抽象出同步细节(在需要时交换分布式实现).我已经创建了一个单独的jvm实现,它允许将字符串作为互斥体存储在映射中,以确保使用一个引用,即使传入不同引用的字符串.并发似乎工作正常,但我是惊讶地看到测试表明参考计数从未减少.我假设使用WeakValues()就足以防止内存泄漏,但似乎并非如此.任何人都可以指出可能导致这种泄漏的原因吗?
public class SynchronousMethodExecutorSynchronizedImpl implements ISynchronousMethodExecutor {
// mutex map to provide string references
final Map<String, String> mutexMap = new MapMaker()
.weakValues()
.makeComputingMap(
new Function<String, String>() {
@Override
public String apply(String id) {
return id;
}
});
@Override
public Object doSynchronousMethod(String domain, String id, ISynchronousMethod synchronousMethod) {
synchronized(mutexMap.get(domain + "." + id))
{
return synchronousMethod.execute();
}
}
Run Code Online (Sandbox Code Playgroud)
}
这是在最后一个断言失败的测试:
public class SynchronousMethodExecutorSynchronizedImplTest extends TestCase {
int counter;
SynchronousMethodExecutorSynchronizedImpl methodExecutor;
@Override
public void before() throws Exception {
super.before();
methodExecutor = new …Run Code Online (Sandbox Code Playgroud) java memory synchronization memory-leaks concurrent-collections