Жесткое кодирование хеш-таблицы внутри класса, как это сделать потокобезопасным способом? - PullRequest
0 голосов
/ 05 декабря 2011

Я хочу инициализировать хеш-таблицу внутри моего класса только один раз для моего веб-приложения.

Как вы можете сделать это в поточно-ориентированном режиме в случае?

public class MySettings {

   private HashTable<int, SomeObject> settings;

}

Должно ли этобыть отмеченным статическим или окончательным или изменчивым?Я обертываю это в синхронизации?

Кроме того, как я могу установить свойства SomeObject inline?Это возможно в Java?

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Сделайте его статическим, окончательным, инициализируйте его и используйте ConcurrentHashMap .

Вы можете даже создать для этого синглтон-класс и сделать его ленивым.

Как то так. Но опять же, используйте ConcurrentHashmap. Не используйте Hashtable.

import java.util. *;

class Foo { 
        private static final Foo foo = new Foo(); 
        public static final Hashtable table = new Hashtable(); 
        private Foo(){} 

        public static Foo Instance(){
            return foo;
        }

} 
0 голосов
/ 05 декабря 2011

Я хочу инициализировать хеш-таблицу внутри моего класса только один раз для моего веб-приложения.

Если вы хотите, чтобы для вашего веб-приложения был только один экземпляр, тогда вы можете выбрать:

  • голый static (неприятный !!),

  • a static, обернутый классом со статическими методами (неприятный и неудобный дляиспользуйте),

  • и static, завернутый с использованием шаблона класса Singleton (не такой неприятный / неловкий, но не без проблем), или

  • общий экземпляр, который создается и внедряется с использованием инфраструктуры внедрения зависимостей (DI).

Последний вариант лучше всего подходит по ряду точек зрения, но он предполагает изменение вашего веб-приложения для использования DI,что будет разрушительным.

Поэтому я предлагаю вам прочитать шаблон класса Singleton и узнать, как его реализовать в Java, чтобы он создавал и инициализировал потокобезопасным способом:

Тогда возникает отдельный вопрос / вопрос о том, как вы используете хеш-таблицу в поточно-ориентированном режиме.И ответы / решения зависят от того, как ваше приложение будет использовать хеш-таблицу после ее инициализации.

  • Если веб-приложение только когда-либо считывает хеш-таблицу, тогда достаточно простого HashMap.

  • Если веб-приложению необходимо прочитать и обновить хэш-таблицу, то можно выбрать между ConcurrentHashMap или синхронизированной оболочкой для обычногоHashMap.

    • Если в таблице может быть много потоков, желающих выполнить операции (т. Е. Вероятна проблема с блокировкой), ИЛИ если вам нужно иметь возможность выполнять итерациюзаписей в таблице, пока обновления могут происходить, затем используйте ConcurrentHashMap.

    • В противном случае HashMap с оболочкой синхронизации будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...