Гибкие альтернативы для блокировки (выборочная блокировка) - PullRequest
0 голосов
/ 29 мая 2018

Мне нужно разрешить ситуацию для одинаковых объектов с разным расположением памяти (это происходит для REST-запроса из-за многопоточности).

Так что в качестве части решения я реализовал сервис.Я делюсь здесь наиболее важными частями:

private Map<T, ReentrantLock> lockHolder = new HashMap();

void unLock(T monitorMarker) {
    synchronized (lockHolder) {
        ReentrantLock lock = lockHolder.get(monitorMarker);
        if (lock == null || lock.getHoldCount() == 0) {
            return;
        }
        lock.unlock();
        if (lock.getHoldCount() == 0) {
            lockHolder.remove(monitorMarker);
        }
    }
}

ReentrantLock getLockForCalendar(T monitorMarker) {
    synchronized(monitorMarker) {
        ReentrantLock lock = lockHolder.get(monitorMarker);
        if (lock == null) {
            lock = new ReentrantLock();
            lockHolder.put(monitorMarker, lock);
        }
        return lock;
    }
}

в целом работает без проблем.

Сейчас мне нужно сопоставить эту утилиту с метаданными домена (решение может быть с использованием Map<String, Map<Object, Lock>> или внедрением кэша и ничего неразрешимого) ...

Я предпочитаю использовать JDK util или open sourceиспользовать с аналогичным решением, потому что они уже обеспечивают обработку этих случаев ... Я считаю, что многие разработчики сталкивались с подобными проблемами, и решение должно присутствовать в библиотеках с открытым исходным кодом.Я исследовал spring утилиты, apache утилиты некоторых google библиотек, но я не нашел удовлетворительного результата.

Предложите мне подумать о том, какие библиотеки использовать, пожалуйста.

1 Ответ

0 голосов
/ 29 мая 2018

Реализация полосатой блокировки в Guava делает то, что вы делаете, но правильно (и с гораздо большим количеством опций, касающихся слабых блокировок, лени, семафоров вместо блокировок и т. Д.).

Это не такэто отличается от того, что вы сделали, но вы объединили synchronized с блокировками, тогда как ConcurrentHashMap может избавить от явной синхронизации (и обеспечить некоторые преимущества в производительности, не блокируя всю карту при каждом обращении к ней).

...