Исходный код держит блокировку на весь объект map на протяжении всего синхронизированного блока, включая операции, которые не требуют синхронизации. Это создает ненужное состязание за блокировку и снижает возможности параллельного доступа.
Выноси потоконезависимые операции за пределы синхронизированного блока. Только сама операция с map требует синхронизации.
Random r = new Random();
Integer value = Integer.valueOf(42);
String key = r.nextString(5);
synchronized (map) {
map.put(key, value);
}
map.put(), а не во время создания объекта или генерации строкиПотоконезависимые операции, которые стоит выносить за пределы синхронизированных блоков:
Только критические операции, которые обращаются к общему ресурсу или модифицируют его, должны оставаться внутри синхронизированного блока.
Перемещение создания объектов и генерации строк за пределы synchronized блока снижает конкуренцию за блокировку, уменьшая общее время, в течение которого один поток удерживает блокировку.
Новый — ещё не проверен сообществом
Вы