Хеш-карты, используемые в многопоточной среде

public class Test {
    private final Map<URI, Set<TestObject>> uriToTestObject = new HashMap<URI, Set<TestObject>>();
    private final Map<Channel, TestObject> connToTestObject = new HashMap<Channel, TestObject>();

    private static class TestObject {
        private URI server;
        private Channel channel;
        private final long startNano = System.nanoTime();
        private AtomicInteger count = new AtomicInteger(0);
    }
}

Это класс, который я планирую использовать в качестве диспетчера соединений. Есть две карты: одна будет иметь uri сервера для сведений о соединении, т. е. тестовый объект, а другая будет иметь канал для TestObject, т. е. детали записи соединения, когда соединение будет создано, поместите testobject канала и uri сервера в соответствии с требованиями на обеих картах, когда подайте другой запрос сначала проверьте карту для этого сервера uri и получите канал, аналогично, когда канал закрыт, удалите с обеих карт соответствующие записи, т.е. объект канала и тестовый объект, должен ли я использовать параллельную хэш-карту или должен использовать HashMap, а затем синхронизировать на методы добавления и удаления, также я буду использовать переменную count AtomicInteger для целей статистики, она будет увеличиваться и уменьшаться.

Мой вопрос здесь в многопоточной среде, нужно ли мне синхронизировать мои методы, даже если я использую ConcurrentHashmap, так как я буду выполнять некоторые операции на обеих картах одним методом.


person rohit singh    schedule 25.12.2013    source источник
comment
связанные: stackoverflow.com/ вопросы/1361784/   -  person    schedule 25.12.2013
comment
видел соответствующий пост, но до сих пор не могу понять этот момент. Любые операции с несколькими ключами или проверками и действиями, которые должны быть атомарными, не будут таковыми, и потребуется дополнительная блокировка на стороне клиента. может быть примером, к которому я могу относиться   -  person rohit singh    schedule 25.12.2013
comment
Ваш класс является безопасным, потому что ни к одному из его членов нельзя получить доступ (все частные). Вам нужно показать, как вы планируете использовать класс.   -  person assylias    schedule 25.12.2013


Ответы (2)


Да, вам нужно synchronization в среде multi-threaded. Лучше, если вы будете использовать синхронизацию на уровне блоков вместо синхронизации на уровне методов.

Фрагмент кода:

Object lock = new Object();

void method1(){
   synchronized(lock){
   //do your operation on hash map
   }
}

void method2(){
   synchronized(lock){
   //do your operation on hash map
   }
}

И о ConcurrentHashMap

Операции извлечения (включая получение) обычно не блокируются, поэтому могут пересекаться с операциями обновления (включая размещение и удаление).

Так что да, вам все равно может понадобиться syncronization даже если вы использовали ConcurrentHashMap.

person Vinay Pareek    schedule 25.12.2013

Поскольку вам нужно работать с двумя картами одновременно,
лучше сделать метод синхронизированным.
И HashMap достаточно, если метод синхронизирован.

person Ivan    schedule 25.12.2013