почему метод get не синхронизируется в concurrenthashmap? [Дубликат]

Короткий ответ: вам нужно выполнить обратный вызов следующим образом:

function callback(response) {
    // Here you can do what ever you want with the response object.
    console.log(response);
}

$.ajax({
    url: "...",
    success: callback
});
20
задан MeanwhileInHell 23 September 2014 в 16:06
поделиться

2 ответа

Нет, вы теряете преимущества ConcurrentHashMap, делая это. Вы также можете использовать HashMap с synchronized или synchronizedMap(), чтобы заблокировать всю таблицу (это то, что вы делаете, когда обертываете операции в synchronized, так как подразумевается монитор - это весь экземпляр объекта.)

Цель ConcurrentHashMap - увеличить пропускную способность вашего параллельного кода, разрешив одновременное чтение / запись в таблице без блокировки всей таблицы. Таблица поддерживает это внутренне, используя блокировку (несколько блокировок вместо одного, причем каждая блокировка назначена на набор хэш-кодов) - см. Java Concurrency in Practice от Goetz и др.).

Когда вы используете ConcurrentHashMap, все стандартные методы карты (put(), remove() и т. д.) становятся атомарными в силу блокировки и т. д. в реализации. Единственные компромиссы в том, что такие методы, как size() и isEmpty(), могут не обязательно возвращать точные результаты, поскольку единственный способ, который они могли бы использовать для всех операций по блокировке всей таблицы.

ConcurrentMap интерфейс также добавляет новые операции с атомарным соединением, такие как putIfAbsent() (поместите что-то только в том случае, если ключ еще не на карте), remove() принимает оба ключа и значение (удалите запись, только если ее значение равный параметру, который вы передаете) и т. д. Эти операции потребовали блокировки всей таблицы, потому что им требовались два вызова метода для выполнения (например, putIfAbsent() нуждались бы в вызовах как containsKey(), так и put(), обернутые внутри одного synchronized block, если вы использовали стандартную реализацию Map.) Еще раз вы получаете большую пропускную способность, используя эти методы, избегая блокировки всей таблицы.

43
ответ дан sparc_spread 28 August 2018 в 08:04
поделиться

Синхронизация этих операций не приносит пользы здесь - это фактически ухудшает производительность, если вам не нужна синхронизация.

Причина ConcurrentHashMap была создана, это синхронизированные карты (либо реализованы вручную, как в вопрос или созданный обычным способом с Collections.synchronizedMap(map)) показывают плохую производительность при доступе к множеству потоков. Блокировать операции «Поместить и получить», чтобы все остальные потоки должны были ждать и не могли одновременно получать доступ к карте. ConcurrentHashMap - как следует из названия - позволяет одновременный доступ, с другой стороны. Вы теряете это преимущество, если добавляете синхронизацию.

9
ответ дан kapex 28 August 2018 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: