Как сделать класс, имеющий несколько состояний, безопасным для потока? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть класс ниже, где

public class LRUCache {
   private HashMap<String,String> dataMap;
   private HashMap<String,String> analyticsMap;

   public put(String key, String value) {
       dataMap.put(key, value);
       String date = getCurrentDateAsString();
       analyticsMap.put(key, date);
   }
   public get(String key) {
       String date = analyticsMap.get(key);
       boolean dateExpired = isDateExpired(date);
       boolean value = null;
       if (!dateExpired)
           value = dataMap.get();
       return value;
   }

}

В этом классе у меня есть 2 хеш-карты, которые доступны в методах get и put.Как сделать этот класс безопасным для потока?

Нужно ли синхронизировать и получить, и положить, что должно решить мою проблему?В общем, если у меня в классе более одного состояния, то вместо того, чтобы каждый из них использовал 2 concurrentHashMaps, я должен поместить их в синхронизированный метод?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я бы использовал ReentrantLock https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html, тогда вы можете просто синхронизировать блок, а не весь метод.

0 голосов
/ 25 октября 2018

Простое использование структур ConcurrentHashMap не делает ваш класс LRUCache поточно-ориентированным.Вам нужно было бы правильно контролировать доступ, чтобы никакой другой поток не мог изменить базовое содержимое, когда вы выполняете многошаговые операции put / get.Это может быть достигнуто с помощью synchronized методов или ReentrantReadWriteLock блокировок чтения / записи.

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html

Из официального Javadoc (мои основные моменты) https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html:

Хеш-таблица, поддерживающая полный параллелизм получения и высокий ожидаемый параллелизм для обновлений.Этот класс подчиняется той же функциональной спецификации, что и Hashtable, и включает версии методов, соответствующие каждому методу Hashtable. Однако, несмотря на то, что все операции являются поточно-ориентированными, операции извлечения не влекут за собой блокировку, и нет никакой поддержки для блокировки всей таблицы таким образом, чтобы предотвратить любой доступ. Этот класс полностью совместим с Hashtableв программах, которые полагаются на безопасность потоков, но не на детали синхронизации.

...