2016-05-02 5 views
-1

У меня есть метод, который принимает параметр Object ob.
Этот метод имеет локальный HashMap<String, String> mp, который заполнен полями ob, он также вызывает другие методы, передающие ob и mp в качестве параметров.Проблема параллелизма с локальным hashmap

Проблема в том, что иногда mp заполняется полями разных ob объектов.

Я думаю mp испытывает проблемы параллелизма,
Что является лучшим способом для синхронизации mp зная, что она заполняется на местном уровне и передается в качестве параметра к различным методам, чтобы получить заполнены, а также.

Я не имею или нити управления, приложение развертывается на сервере WebLogic Server, поэтому он вызывается через веб-сервисы, так много звонков

+0

Добавить код Пожалуйста, – Sanjeev

+0

Параллелизм не приведет к заполнению mp withe ob объектов, если нет кода, который явно это делает. Код был бы полезен !!! –

+0

Код очень длинный, он вызывает много методов, передающих mp и ob в качестве параметров, без использования здесь, во всем методе (и вызываемых методах) передаются и используются те же mp и ob. , , – GingerHead

ответ

1

Для таких случаев у вас есть

java.util.concurrent.ConcurrentHashMap<K,V> 

Подробности here.

Короче говоря, ConcurrentHashMap работает, разделяя блоки, которые будут заблокированы независимо, поэтому никакие другие потоки не смогут получить к нему доступ до тех пор, пока работа не будет выполнена (но в то же время к ним можно получить доступ к другим блокам). Размер блока по умолчанию - 16. Подробнее об этом here.

Теперь вы должны понимать размеры карт, чтобы говорить о его заполнении. Размер по умолчанию - 16. Но коэффициент загрузки равен 0,75, это означает, что когда карта будет заполнена на 75%, она изменит размер в два раза по сравнению с предыдущим размером, что означает создание нового массива нового набора ключей, а затем копирование всего на него (когда я говорю новый Set, я имею в виду такую ​​же логику для изменения размера). Теперь, если вы заполните его быстро, это означает, что много копирования и для больших размеров, это занимает много времени, поэтому лучше, чтобы дать ему большой начальный размер в начале, как:

ConcurrentHashMap<String, Object> mp = new ConcurrentHashMapy<>(someLargeSize); 

Пусть someLargeSize быть порядок чего-то, чего вы ожидаете или, по крайней мере, рядом с ним, поэтому вы уменьшаете размер до минимума. Не касайтесь коэффициента нагрузки, он просто снизит производительность, 75% в порядке.

И кстати., Максимальный размер HashMap и ConcurrentHashMap (и HashSet, и ArrayList, или любого массива на основе структуры данных) в Java является 1,073,741,824, поскольку array[] находится в фоновом режиме, DS в Java, в основном, только упаковщики со специальными функциями для этого, но я сомневаюсь, что вы когда-либо достигнете этого предела, поскольку для объектов, содержащих некоторые строки или что-то еще, для этого вам нужно много ГБ ОЗУ.

+0

Помогает ли это так, чтобы только один поток мог получить доступ к этой локальной карте во всем методе? – GingerHead

+0

добавил ответ на ваш вопрос, после «Подробности здесь» –

+0

Как узнать, что работа выполнена ?, Мне нужно, чтобы она была защищена на всем протяжении своей жизни, я имею в виду от начала ее инициализации в методе до его возвращения, прохождения через все другие методы, называемые его владельцем метода как параметр – GingerHead

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