2016-03-09 5 views
-2

Я знаю, что мы можем иметь карту, разработанную таким образом, чтобы с помощью параллельной утилиты она позволяла изменять данные карты одним пользователем за один раз. Я хочу знать, применимо ли это одновременное поведение только для операций put, а также для конкретной операции size. Следующий код иллюстрирует вопрос:Ошибка параллельной работы Java

один поток в этом блоке кода

if(map.size()) 
{ 
    //do something 
} 

в то время как другой поток в этом блоке

map.put(obj); 

Я хочу знать, если size операция получает останавливается до завершения операции put и наоборот.

+1

You Better изменения «Я знаю, что» до «Я понял, что/я обнаружил, что», опечаток, изменение «Я хочу знать», чтобы " Мне нравится узнать/мне нужно знать, что звучит лучше. – Prasad

+0

** Это зависит от реализации ** Карты. –

ответ

0

Короче говоря, да: size() должен дождаться мьютекса, прежде чем его можно будет выполнить. Collections.synchronizedMap(Map) возвращает SynchronizedMap с оригинальной картой. Каждый открытый метод синхронизированной карты синхронизируется с помощью одного частного мьютекса. Например, вот toString() метода:

public String toString() { 
    synchronized (mutex) {return m.toString();} 
} 

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

Кроме того, ручная синхронизация может быть необходимо, если вы, скажем Перебор ключей набора:

Крайне важно, чтобы пользователь вручную синхронизировать на возвращаемом * карта при переборе над любым из его сбора данных ... Несоблюдение этого совета может привести к детерминированному поведению.

Рассмотрим следующий пример:

//inside thread1 
if(map.size()>n){ 
    //do something 
    System.out.println(map.size()); 
} 

//inside thread2 
map.put(obj); 

В этом случае значение map.size() в if заявлении thread1 не обязательно будет равна напечатанной стоимости map.size() внутри //do something блока. В этом случае вам придется вручную синхронизировать на карте:

synchronize(map){ 
    if(map.size()>n){ 
     //do something 
    } 
} 
Смежные вопросы