Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Unsafe — putIfAbsent в ConcurrentMap— это вы так назвали вариант http://stackoverflow.com/questions/21286831/managing-multiple-locks/21339300#21339300? Что ж в нем небезопасного? Если вы там обнаружили ошибку, то сообщите в комментарии к варианту.
private Mailbox getMailbox(UserId id) {
Mailbox fromCache = cache.get(id);
if (fromCache != null) {
return fromCache;
}
Mailbox fromPersistenceService = null;
try {
fromPersistenceService = pService.loadMailbox(id);
} catch(MailboxDoesntExistException e) {
fromPersistenceService = new Mailbox();
} catch(MessagingPersistenceServiceException e) {
throw new MessagingServiceException("Couldn't retrieve mailbox due", e);
}
cache.put(id, fromPersistenceService);
return fromPersistenceService;
}
private Mailbox getMailbox(UserId id) {
Mailbox fromCache = cache.get(id);
if (fromCache != null) {
return fromCache;
}
Mailbox fromPersistence = //create mailbox
cache.put(id, fromPersistence);
return cache.get(id);
}
public class UnsafeIdBasedLockManager<K> extends AbstractIdBasedLockManager<K>
implements IdBasedLockManager<K> {
private ConcurrentMap<K, IdBasedLock<K>> locks = new ConcurrentHashMap<K, IdBasedLock<K>>();
// blah blah blah
}
@Override
public void releaseLock(IdBasedLock<K> lock) {
K id = lock.getId();
lock.lock();
if (lock.getRefCount().get() == 1) {
IdBasedLock previous = locks.remove(id);
}
lock.decreaseRefCount();
lock.unlockWithoutRelease();
}


IdBasedLocking