Статично, инициализировал unmodifiableCollection.get, гарантируемый неизменным?

Статично, инициализировал unmodifiableCollection.get, гарантируемый неизменным?

Для:

статическое заключительное НЕЧТО Карты = Collections.unmodifiableMap (новый HashMap ());

Несколько потоков могут использовать метод, добираются и не сталкиваются с проблемами?

Даже через объекты в НЕЧТО не может быть добавлен/удален, что останавливает получить метод от управления внутренним состоянием НЕЧТО для кэширования целей и т.д. Если внутреннее состояние изменяется всегда затем, НЕЧТО не может использоваться одновременно. Если это верно, где истинные неизменные наборы в Java?

6
задан Phil 15 January 2010 в 22:14
поделиться

6 ответов

Бывает ли 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!
-1
ответ дан 17 December 2019 в 07:04
поделиться

На самом деле хороший вопрос. Думаю Solidhashmap - это может измениться, не имея операцию мутации. LinkedHashmap в режиме доступа-заказа намного одинаково.

Документы API для HASHMAP Состояние:

Обратите внимание, что эта реализация не синхронизирован. Если несколько потоков Доступ к хеш-карте одновременно и в минимум один из потоков изменяет карта структурно, это должно быть синхронизировано снаружи. (Структурное модификация - это любая операция, которая добавляет или удаляет одну или несколько сопоставлений; просто меняя значение, связанное с ключом, который уже экземплярный Содержит не структурный модификация.)

Предположительно, что должно быть, если и только тогда, когда. Это означает, что GOW не нужно синхронизироваться, если хесмап [эффектно неизменно ».

0
ответ дан 17 December 2019 в 07:04
поделиться

Нет настоящей неизменной карты в Java SDK. Все предложенные карты Chris являются только безопасными потоками. Немодифицируемая карта не является неизменным, поскольку, если основная карта изменилась там, будет concurrentModificationException .

Если вы хотите по-настоящему неизменной карте, используйте ImmutableMap из Google Collections / Guava.

0
ответ дан 17 December 2019 в 07:04
поделиться

Рискуя прозвучать так, как будто я занимаюсь рекламой, используйте Google Immutable Collections и покончите с этим.

2
ответ дан 17 December 2019 в 07:04
поделиться

Это в основном стандартные перезаписи, которые проверяют, существует ли запрашиваемый файл (или каталог или символьная ссылка) на диске, и в этом случае файл/каталог/и т.д. следует использовать.

Все остальные совпадения должны идти на/votes/public/index.php

-121--3942010-

Первое правило будет проходить через все запросы, которые могут быть сопоставлены с обычным файлом размером больше нуля ( -s ), символьной ссылкой ( -l ) или каталогом ( -d ). Каждый другой запрос выбирается по второму правилу и переписывается на /vote/public/index.php .

-121--3942011-

Я бы предложил для любой многопоточной операции использовать ConcurrentHashMap или HashTable, оба являются поточными.

-1
ответ дан 17 December 2019 в 07:04
поделиться

Учитывая конкретный пример:

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 явно безопасен для многопоточного доступа. Внутреннее состояние может быть изменяемым, но внешне видимое состояние не будет, и поскольку класс гарантированно является потокобезопасным, мы можем смело считать его внешне неизменяемым.

4
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: