Существует два аспекта стоимости синхронизации.
Служебные расходы самой synchronized
;и
Стоимость операций, выполняемых в этом блоке.
В качестве примера:
public synchronized int[] getState() {
return new int[] { state1.size(), state2.size() };
}
this
используется для блокировки.Операции в этом случае являются чрезвычайно дешевыми (т.е. получение size()
из Colleciton
или Map
).Таким образом, единственное беспокойство - это стоимость synchronized
.
В современных JVM стоимость настолько низкая, что о ней даже не стоит беспокоиться, кроме как в самых экстремальных ситуациях.Под «наиболее экстремальным» я подразумеваю, когда количество таких вызовов невероятно велико или требуемая задержка невероятно мала (менее микросекунды).
Так что просто используйте synchronized
.Он гораздо более читабелен, и производительность просто не является проблемой для того, чего вы хотите, если только в этом нет чего-то большего.