/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.framework.util;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class GenericConcurrencyLock<T>
{
private final Map<T, WeakReference<Lock>> lockMap = new HashMap<T, WeakReference<Lock>>();
public static <T> GenericConcurrencyLock<T> create()
{
return new GenericConcurrencyLock<T>();
}
public Lock getLock( T key )
{
Lock lock;
synchronized ( lockMap )
{
lock = getLockFromMap( key );
if ( lock == null )
{
lock = new ReentrantLock();
WeakReference<Lock> value = new WeakReference<Lock>( lock );
lockMap.put( key, value );
}
}
return lock;
}
private Lock getLockFromMap( T key )
{
WeakReference<Lock> weakReference = lockMap.get( key );
if ( weakReference == null )
{
return null;
}
return weakReference.get();
}
}