В многопоточном (Java или .NET) программа, я могу предположить, что копирование переменной является атомарным?

Просто вкратце расскажу о том, как работает 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);

6
задан Community 23 May 2017 в 11:48
поделиться

7 ответов

Нет. Например, длинные переменные в Java не являются атомарными на 32-разрядных машинах.

Кроме того, существует "поток, кэширующий" проблему - если Ваша переменная не является энергозависимым или внутренним синхронизируемым блоком, другой поток не может видеть изменение в значении переменной. Это верно для всех типов переменных, не просто долго.

Чтение здесь: http://gee.cs.oswego.edu/dl/cpj/jmm.html, особенно "атомарность" и абзацы "видимости".

13
ответ дан 8 December 2019 в 04:56
поделиться

Нет, это не является атомарным. Посмотрите этот вопрос для того, почему и что делать с этим.

6
ответ дан 8 December 2019 в 04:56
поделиться

Вы должны быть обеспокоены видимостью изменений в других потоках при работе над 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. */
         ...
      }
    }
  }
}
2
ответ дан 8 December 2019 в 04:56
поделиться

Смотрите на java.util.concurrent.atomic - могут быть некоторые хорошие вещи там, можно использовать.

4
ответ дан 8 December 2019 в 04:56
поделиться

Установка 32-разрядного (по крайней мере, в.NET) является атомарной, но она делает Вас отрицательный результат. Необходимо считать его, чтобы знать, заблокировано ли это, таким образом, Вы могли бы считать его, и после чтения, кто-то еще читает его, прежде чем можно будет установить его, таким образом, два потока заканчиваются в "защищенном" коде. Это точно, для чего фактические объекты синхронизации (как класс Монитора.NET). Вы могли использовать Взаимно блокируемый, чтобы проверить и увеличить переменную блокировки также.

См. также: Действительно ли доступ является переменной в C# атомарная операция?

1
ответ дан 8 December 2019 в 04:56
поделиться

Зависит очень от аппаратных средств и JVM, которую Вы выполняете

На некоторых аппаратных средствах и некотором JVMs некоторые копии будут атомарными, но более безопасно предположить дело обстоит не так даже, что простое целое число к целочисленному присвоению может перевести в четыре машинных команды на x856 аппаратных средствах.

Строка и копии массива могут включить последовательность тысяч инструкций, и для двух потоков возможно обновить одновременно.

0
ответ дан 8 December 2019 в 04:56
поделиться

Насколько я понимаю, не всегда.

Int32 будет, Int64 не будет в системе на 32 бита, поскольку этому нужно 2 x 32 бита. Поэтому это не помещается в одни 32 битовых ячейки.

-2
ответ дан 8 December 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: