Можно ли использовать квалификатор :volatile-mutable
с deftype
в однопоточной программе? Это продолжение до this question, this one и this one. (Это вопрос Clojure, но я добавил тег «Java», потому что Java-программисты также могут получить информацию об этом.)Риски изменчивых переменных полей в однопоточных контекстах?
Я обнаружил, что могу добиться значительного повышения производительности в программе, которую я работая в систему с помощью :volatile-mutable
полей в deftype
, а не атомов, но я волнуюсь, потому что для deftype
строка документации говорит:
Обратите внимание также, что изменяемые поля чрезвычайно трудно правильно использовать , и присутствуют только для облегчения здание более высоких конструкций уровня, таких как ссылочные типы Clojure, в Clojure . Они предназначены только для экспертов - если семантика и последствия of: volatile-mutable или: unsynchronized-mutable не являются незамеченными , вам не следует их использовать.
В самом деле, семантика и последствия :volatile-mutable
являются не сразу очевидны для меня.
Однако глава 6 из Clojure Программирование, по Эмерик, Карпер и Гранд говорит:
«Летучие» здесь имеет то же значение, что и летучего модификатора поля в Java: чтение и запись атомный и должен быть выполнен в заказе программы; то есть они не могут быть переупорядочены компилятором JIT или процессором. Таким образом, летучие являются неудивительными и потокобезопасными, но несогласован и все еще полностью открыт для условий гонки.
Это подразумевает, что до тех пор, как доступ к одному летучим изменяемому deftype
поля все имеет место в одном потоке, нет ничего особенного беспокойства. (Nothing special, в котором мне все еще нужно быть осторожным, как я обрабатываю состояние, если я могу использовать ленивые последовательности.) Поэтому, если ничто не вводит параллелизм в мою программу Clojure, не должно быть никакой особой опасности для использования deftype
с :volatile-mutable
.
Верно ли это? Какие опасности я не понимаю?
Если у вас есть один поток java, а 'volatile' имеет то же значение, что и volatile java, вам вообще не нужно' volatile'. – ZhongYu
атомарность - еще одна проблема. вы могли бы иметь проблемы параллелизма даже с одним потоком. Но я не знаком с Clojure, поэтому не могу комментировать. – ZhongYu
bayou.io: ключевое слово volatile также гарантирует, что порядок вызовов вызовов изменчивых переменных не может быть переупорядочен. В некоторых случаях это может пригодиться, но я не могу думать об этом. –