日付の時刻に個々のロックをハッシュできます。
private static final ConcurrentMap<Long,Lock> dateLock = new ConcurrentHashMap<Long,Lock>();
public static Lock getLock(Date date){
Lock lock = dateLock.get(date.getTime());
if(lock == null){
Lock lock = new ReentrantLock();
Lock temp =dateLock.putIfAbsent(lock);
lock = temp == null ? lock : temp;
}
return lock;
}
同じ日が必要で、必ずしもミリ秒単位の正確な日付である必要がない場合は、次のようなことができます。
private static final ConcurrentMap<String,Lock> dateLock = new ConcurrentHashMap<String,Lock>();
public static Lock getLock(Date date){
String formattedDate = new SimpleDateFormat("MM\dd\yyyy").parse(date);
Lock lock = dateLock.get(formattedDate);
if(lock == null){
Lock lock = new ReentrantLock();
Lock temp =dateLock.putIfAbsent(lock);
lock = temp == null ? lock : temp;
}
return lock;
}
次に、日付で相互排除が必要なリクエスト
Date date = ...;
Lock lock = getLock(date);
lock.lock();
など