Просто вкратце расскажу о том, как работает module.exports.
var module = {
exports: {},
};
// Previously module.exports was an object, now it's a string
// primitive, therefore cannot have properties assigned to it.
module.exports = "abc";
console.log(typeof module.exports)
// Calling new String However returns an object, which can be assigned new
// properties, which is why it worked
module.exports = new String('abc')
console.log(typeof module.exports);
Нет. Например, длинные переменные в Java не являются атомарными на 32-разрядных машинах.
Кроме того, существует "поток, кэширующий" проблему - если Ваша переменная не является энергозависимым или внутренним синхронизируемым блоком, другой поток не может видеть изменение в значении переменной. Это верно для всех типов переменных, не просто долго.
Чтение здесь: http://gee.cs.oswego.edu/dl/cpj/jmm.html, особенно "атомарность" и абзацы "видимости".
Нет, это не является атомарным. Посмотрите этот вопрос для того, почему и что делать с этим.
Вы должны быть обеспокоены видимостью изменений в других потоках при работе над JVM. В целом необходимо сделать присвоения в a synchronized
блок или переменная должен быть volatile
, или необходимо использовать переменную обертку от java.util.concurrent.atomic
пакет.
Однако в Вашем случае, это кажется, что у Вас есть всего один поток, который когда-либо очищает "грязный" флаг — поток, который сохраняет данные. Если это так, очистите флаг прежде, чем записать данные. Если другие потоки установят его, в то время как Вы пишете данные, это останется установленным до следующей запланированной записи. Я использовал бы AtomicBoolean
, для предоставления персистентности распараллеливают атомарность между проверкой флага и очисткой его, как это:
private final AtomicBoolean dirty = new AtomicBoolean();
/**
* Any method that modifies the data structure should set the dirty flag.
*/
public void modify() {
/* Modify the data first. */
...
/* Set the flag afterward. */
dirty.set(true);
}
private class Persister extends Thread {
public void run() {
while (!Thread.interrupted()) {
if (dirty.getAndSet(false)) {
/* The dirty flag was set; this thread cleared it
* and should now persist the data. */
...
}
}
}
}
Смотрите на java.util.concurrent.atomic - могут быть некоторые хорошие вещи там, можно использовать.
Установка 32-разрядного (по крайней мере, в.NET) является атомарной, но она делает Вас отрицательный результат. Необходимо считать его, чтобы знать, заблокировано ли это, таким образом, Вы могли бы считать его, и после чтения, кто-то еще читает его, прежде чем можно будет установить его, таким образом, два потока заканчиваются в "защищенном" коде. Это точно, для чего фактические объекты синхронизации (как класс Монитора.NET). Вы могли использовать Взаимно блокируемый, чтобы проверить и увеличить переменную блокировки также.
См. также: Действительно ли доступ является переменной в C# атомарная операция?
Зависит очень от аппаратных средств и JVM, которую Вы выполняете
На некоторых аппаратных средствах и некотором JVMs некоторые копии будут атомарными, но более безопасно предположить дело обстоит не так даже, что простое целое число к целочисленному присвоению может перевести в четыре машинных команды на x856 аппаратных средствах.
Строка и копии массива могут включить последовательность тысяч инструкций, и для двух потоков возможно обновить одновременно.
Насколько я понимаю, не всегда.
Int32 будет, Int64 не будет в системе на 32 бита, поскольку этому нужно 2 x 32 бита. Поэтому это не помещается в одни 32 битовых ячейки.