Короткий ответ: вам нужно выполнить обратный вызов следующим образом:
function callback(response) {
// Here you can do what ever you want with the response object.
console.log(response);
}
$.ajax({
url: "...",
success: callback
});
Нет, вы теряете преимущества 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
.) Еще раз вы получаете большую пропускную способность, используя эти методы, избегая блокировки всей таблицы.
Синхронизация этих операций не приносит пользы здесь - это фактически ухудшает производительность, если вам не нужна синхронизация.
Причина ConcurrentHashMap
была создана, это синхронизированные карты (либо реализованы вручную, как в вопрос или созданный обычным способом с Collections.synchronizedMap(map)
) показывают плохую производительность при доступе к множеству потоков. Блокировать операции «Поместить и получить», чтобы все остальные потоки должны были ждать и не могли одновременно получать доступ к карте. ConcurrentHashMap
- как следует из названия - позволяет одновременный доступ, с другой стороны. Вы теряете это преимущество, если добавляете синхронизацию.