Javadoc из Files.createFile(…)
, часть java.nio.file
, доступная с Java 7, повторяет обещание атомарности, но ничего не упоминает о блокировке на основе файлов.
Мое рассуждение:
java.nio.file.Files
) влияют те же (или похожие) проблемы, что и более старые (из java.io.File
), и Javadoc просто пропускает эту информацию ... Учитывая обработку ошибок и спецификации в java.nio.file
, как правило, был улучшен по сравнению с классом File
(существующим с JDK 1.2), я предполагаю, что вторая альтернатива верна.
Мой вывод: использование Files.createFile(…)
отлично подходит для этого использования случай.
Да, они не такие. var a = b = []
эквивалентно
var a;
b = [];
a = b;
Не только a
и b
получают одно и то же значение (ссылка на один и тот же пустой array), b
вообще не объявляется. В строгом режиме в ECMAScript 5 и более поздних версиях это вызовет ошибку ReferenceError
; в противном случае, если в области видимости уже не существует переменная b
, b
автоматически создается как свойство глобального объекта и действует аналогично глобальной переменной, где бы ни находился код, даже внутри функция. Что нехорошо.
Вы можете легко это увидеть:
(function() {
var a = b = [];
})();
console.log(b); // Shows []
Ваш коллега прав. Первый оператор создает новый пустой массив. Затем ссылка на этот массив присваивается b. Затем та же ссылка (которая является результатом выражения присваивания) присваивается объекту. Итак, a и b относятся к одному и тому же массиву.
Во всех остальных случаях вы создаете два отдельных массива.
Между прочим: это поведение довольно распространено и одинаково для всех языков программирования на основе C. Так что это не относится к JavaScript.
В первом примере b
является ссылкой на a
, а b
становится глобальной переменной, доступной из любого места (и заменяет любую переменную b
, которая уже может существовать в глобальной области видимости).
Ваш коллега прав:
var a = b = [];
a.push('something');
console.log(b); // outputs ["something"]
но:
var a = [], b = [];
a.push('something');
console.log(b); // outputs []