2016-07-18 5 views
-3

У меня есть HashSet, который содержит ключи HashMap и обновляет содержимое HashMap, добавляя новый ключ в процесс. После того, как я это сделал, я снова хочу использовать HashSet ключей, так как я знаю, что они постоянно обновлялись с помощью ключей HashMap. Я просто хочу убедиться, что это все сделано одним и тем же потоком, и что здесь нет параллелизма, о котором я мог бы не подозревать, так что я говорю HashMap добавлять новую запись, и до того, как она обновит I использовали информацию HashSet, когда она устарела.Создает ли JVM фоновые потоки при обновлении HashMap, так что HashSet его ключей может быть «устаревшим» в однопоточной программе?

В коде:

HashMap<String, Integer> myHashMap = new HashMap<String, Integer>(); 
HashSet<String> myHashSet = myHashMap.keySet(); 

... processing ... 

myHashMap.put(new_key, value); 

... use the **original** HashSet of keys, myHashSet ... 

Может вышеописанная ситуация происходит, учитывая, что это единственная нить, созданная программистом, так что myHashMap и myHashSet бы из синхронизации? Я не говорю о программисте, создающем более одного потока - основная программа работает в одном потоке (см. Выше).

+1

если вам нужно задать этот вопрос ** короткий ответ ** есть * да, все может пойти не так, и ** длинный ответ ** является слишком широким **. –

+0

Мой вопрос отличается от того, который вы отметили как дубликат. Вы даже прочитали его, прежде чем вы отметили его? У меня только одна нить; Я хочу знать, создает ли JVM в фоновом режиме для обработки обновления HashMap. –

+0

вы также ** ** неясны **, а также один из двух ** дубликатов ** и ** слишком широкий **, тогда, потому что ваш вопрос упоминает * параллелизм * и несколько потоков и использует слово * многопоточность *. Если у вас есть один поток, и вы спрашиваете об этом и не понимаете, что дубликат имеет нужные вам ответы, вам нужно попробовать и еще немного прочитать о том, что такое параллелизм и многопоточность, и как работает JVM. Что заставило бы вас думать, что JVM будет делать то, что вас беспокоит? Все из них даже слишком широк **, чем существующий вопрос. –

ответ

2

Нет, они не будут, потому что набор ключей является видом на фактические клавиши в HashMap.

От Javadocs:

Набор поддерживается картой, поэтому изменения в карте отражены в множество, и наоборот.

И вы можете увидеть то же самое в OpenJDK's implementation of HashMap.

Так что для однопоточной программы они всегда должны быть синхронизированы.

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