/*******************************************************************************
* Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0-standalone.html
******************************************************************************/
package se.unlogic.standardutils.threads;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
public class MutexKeyProvider<T> {
private final WeakHashMap<MutexKey<T>, WeakReference<MutexKey<T>>> keyMap = new WeakHashMap<MutexKey<T>, WeakReference<MutexKey<T>>>();
public MutexKey<T> getKey(T object) {
MutexKey<T> newKey = new MutexKey<T>(object);
synchronized (keyMap) {
WeakReference<MutexKey<T>> reference = keyMap.get(newKey);
if (reference == null) {
return this.addKey(newKey);
}
MutexKey<T> currentKey = reference.get();
if (currentKey == null) {
return this.addKey(newKey);
}
// System.out.println("Returning cached instance of key " + currentKey.getValue() + "[" + this.keyMap.size() + "]");
return currentKey;
}
}
private MutexKey<T> addKey(MutexKey<T> key) {
// System.out.println("\n[mutex] adding id " + key.getValue() + " to mutex map [" + this.keyMap.size() + "]\n");
this.keyMap.put(key, new WeakReference<MutexKey<T>>(key));
return key;
}
}