Предполагая, что commute
используется правильно, не должно быть никакой разницы в наблюдаемых значений работах, за исключением тех случаев, как использование commute
может помочь совершить сделку в высоком конкурирующей сценарии, где это было бы трудно сделать с alter
. Конечно, когда это применимо, это довольно значительная разница в результатах ...
Проще проиллюстрировать, как вещи отличаются от побочных эффектов. Вот однопоточный пример, чтобы проиллюстрировать основное свойство, что
alter
будет называться именно один раз в «операции попытку» (возможно, только один раз),
commute
будет называться именно один раз в «сделки try "(в то время как commute
не приведет к их возникновению, он может быть задействован в повторных попытках, если в одном и том же блоке используется dosync
), а затем один последний раз, чтобы вычислить зафиксированное значение (так, по крайней мере, дважды, но опять же, это не приведет к повторным попыткам):
user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil
Использования некоторых Thread/sleep
с и несколько нитей можно спровоцировать больше повторные попытки на alter
стороны в то же время наблюдения двух повторных попыток на commute
стороны, исследовать влияние на реф истории использования один или другой и т. д.
Я не думаю, что это не по теме. Он просит пример, но может быть так же сформулирован, как «В чем разница между коммутированием и изменением? Может ли кто-нибудь показать мне функцию, которая демонстрирует, что они ведут себя по-другому?» – amalloy
Я согласен, что это действительный и явно не повторяющийся вопрос. Нелегкий ответ приходит на ум, потому что они оба всегда дают одинаковый ответ, просто делайте это в разное время, иногда. –