Вы можете хешировать отдельные блокировки по времени даты.
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();
и пр.