Нет, вы теряете преимущества 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
.) Еще раз вы получаете большую пропускную способность, используя эти методы, избегая блокировки всей таблицы.
Да.
Сигнатура метода для unset ()
выглядит следующим образом:
void unset ( mixed $var [, mixed $var [, mixed $... ]] )
Руководство по PHP может оказаться очень полезным. Вы можете найти любую встроенную функцию и получить довольно подробное описание того, что эта функция делает и т. Д. И ответ - да, вы можете предоставить unset
столько переменных, сколько захотите.