Статично, инициализировал unmodifiableCollection.get, гарантируемый неизменным?
Для:
статическое заключительное НЕЧТО Карты = Collections.unmodifiableMap (новый HashMap ());
Несколько потоков могут использовать метод, добираются и не сталкиваются с проблемами?
Даже через объекты в НЕЧТО не может быть добавлен/удален, что останавливает получить метод от управления внутренним состоянием НЕЧТО для кэширования целей и т.д. Если внутреннее состояние изменяется всегда затем, НЕЧТО не может использоваться одновременно. Если это верно, где истинные неизменные наборы в Java?
Бывает ли Getter на возвращенной карте с двумя внутренними состоянием, неважно, до тех пор, пока объект отчет о его договоре (что является картой, которая не может быть изменена). Таким образом, ваш вопрос «лает на неверное дерево».
Вы правы быть осторожными в немодифицированном виде, в том случае, если у вас нет владения и контроля над картой, который он обернут. Например
Map<String,String> wrapped = new HashMap<String,String>();
wrapped.add("pig","oink");
Map<String,String> wrapper = Collections.unmodifiableMap(wrapped);
System.out.println(wrapper.size());
wrapper.put("cow", "moo"); // throws exception
wrapped.put("cow", "moo");
System.out.println(wrapper.size()); // d'oh!
На самом деле хороший вопрос. Думаю Solidhashmap
- это может измениться, не имея операцию мутации. LinkedHashmap
в режиме доступа-заказа намного одинаково.
Документы API для HASHMAP
Состояние:
Обратите внимание, что эта реализация не синхронизирован. Если несколько потоков Доступ к хеш-карте одновременно и в минимум один из потоков изменяет карта структурно, это должно быть синхронизировано снаружи. (Структурное модификация - это любая операция, которая добавляет или удаляет одну или несколько сопоставлений; просто меняя значение, связанное с ключом, который уже экземплярный Содержит не структурный модификация.)
Предположительно, что должно быть, если и только тогда, когда. Это означает, что GOW
не нужно синхронизироваться, если хесмап
[эффектно неизменно ».
Нет настоящей неизменной карты в Java SDK. Все предложенные карты Chris являются только безопасными потоками. Немодифицируемая карта не является неизменным, поскольку, если основная карта изменилась там, будет concurrentModificationException
.
Если вы хотите по-настоящему неизменной карте, используйте ImmutableMap из Google Collections / Guava.
Рискуя прозвучать так, как будто я занимаюсь рекламой, используйте Google Immutable Collections и покончите с этим.
Это в основном стандартные перезаписи, которые проверяют, существует ли запрашиваемый файл (или каталог или символьная ссылка) на диске, и в этом случае файл/каталог/и т.д. следует использовать.
Все остальные совпадения должны идти на/votes/public/index.php
-121--3942010- Первое правило будет проходить через все запросы, которые могут быть сопоставлены с обычным файлом размером больше нуля ( -s
), символьной ссылкой ( -l
) или каталогом ( -d
). Каждый другой запрос выбирается по второму правилу и переписывается на /vote/public/index.php .
Я бы предложил для любой многопоточной операции использовать ConcurrentHashMap или HashTable, оба являются поточными.
Учитывая конкретный пример:
static final Map FOO = Collections.unmodifiableMap(new HashMap());
Тогда FOO будет неизменным. В нем также никогда не будет никаких элементов. Учитывая более общий случай:
static final Map BAR = Collections.unmodifiableMap(getMap());
Тогда, является ли это неизменяемым, полностью зависит от того, сможет ли кто-то еще получить доступ к базовой карте, и от того, какой это тип карты. Например, если это LinkedHashMap, то базовый связанный список может быть изменен порядком доступа и может измениться путем вызова get (). Самый безопасный способ (с использованием непараллельных классов) сделать это:
static final Map BAR = Collections.unmodifiableMap(new HashMap(getMap()));
javadocs для HashMap подразумевают, что пока вы не вносите структурные изменения в карту, ее можно безопасно использовать одновременно, поэтому это должно быть безопасно для любого из аксессоров, которые вы можете использовать, то есть получения различных наборов и итерации по ним, и тогда get () должен быть безопасным.
Если вы можете использовать параллельные классы, вы также можете:
static final Map BAR = Collections.unmodifiableMap(new ConcurrentHashMap(getMap());
Это будет явно безопасно для использования из нескольких потоков, поскольку ConcurrentHashMap явно безопасен для многопоточного доступа. Внутреннее состояние может быть изменяемым, но внешне видимое состояние не будет, и поскольку класс гарантированно является потокобезопасным, мы можем смело считать его внешне неизменяемым.