package ilarkesto.concurrent.locker; import ilarkesto.base.Str; import ilarkesto.base.time.TimePeriod; import java.util.HashMap; import java.util.Map; public class Locker { private Map<Object, Lock> locks = new HashMap<Object, Lock>(); public void lock(Object object, Object locker, boolean allowRelockBySameLocker, TimePeriod lockTime) throws LockingException { if (object == null) throw new IllegalArgumentException("object == null"); synchronized (locks) { Lock lock = locks.get(object); if (lock != null) { if (lock.isTimedOut()) { locks.remove(object); } else { if (allowRelockBySameLocker && lock.getLocker() == locker) { // locked by locker return; } throw new LockingException(lock); } } lock = new Lock(object, locker, lockTime); locks.put(object, lock); } } public void unlock(Object object) { synchronized (locks) { locks.remove(object); } } @Override public String toString() { synchronized (locks) { return Str.format(locks.values()); } } }