2012-04-04 3 views
1

я следующий кусок кода:безопасность резьбы на HashMap.toString() метод

public Hashmap<String,String> tempmap = new HashMap<String,String>(); 

и функции класса:

void f1(){ 
    synchronized(onClassVariable1){ 
    ....Some code onClassVariable1... 
    String tempString = tempMap.toString(); 
    ... Some work onClassVarible1 and tempString ... 
    } 
    } 

Множественный поток вызова этой функции f1 через объект этого класса ..

это функция потокобезопасная ??

+0

Вы можете использовать 'Collections.synchronizedMap (tempmap)', чтобы получить потокобезопасную карту. – Stephan

+0

Обратите внимание, что вы должны сделать синхронизированный блок как можно короче. После того, как вы закончите с tempMap, выйдите из блока, и вы можете выполнить любую обработку в строке за пределами блока. –

ответ

6

Это зависит от того, существуют ли методы, которые не синхронизируются на onClassVariable1 и модифицируют tempMap.

+0

Чтобы пояснить, что для 'onClassVariable1' должен быть потокобезопасным, все записи на карту должны происходить внутри синхронизированных блоков (которые синхронизируются на одном и том же объекте). Например, Thread-A & Thread-B, вызывающий 'f1' одновременно, не может одновременно вводить синхронизированный блок внутри' f1'. Однако предположим, что у вас есть другая функция 'f2' в другом классе, которая модифицирует' onClassVariable1' вне любого синхронизированного блока. Затем Thread-C может изменять HashMap, пока другой поток находится внутри синхронизированного блока в 'f1' – Cod3Citrus

0

Ничто в HashMap не потокобезопасно, и Javadoc говорит так: «Если несколько потоков доступа к хэш-карты одновременно, и по меньшей мере один из потоков изменяет карту структурно, она должна быть синхронизирована внешне.»

Смежные вопросы