Интересно, является ли следующая структура безопасной нитью. Я знаю, что я должен синхронизировать все обращения к enc
(чтение, запись, добавление/вычитание). Но я хотел бы знать, безопасны ли логические массивы. Они постоянно меняются по различным темам. Я, конечно, говорю о элементах массива, а не о ссылке на массив.Выполняет ли volatile синхронизацию массива атомных типов данных?
public class SimBox {
public static final int HP = 100;
public static final int LP = 35;
public static volatile boolean[] ins = new boolean[16];
public static volatile boolean[] outs = new boolean[16];
public static volatile int enc = 0;
}
Примечание: В этом случае мне не нужно повторно инициализировать массивы. Я только читаю и пишу их элементы. Интересно, я тоже должен объявить их окончательными ?!
Для чего они предназначены?
Для имитации аппаратных/механических движений машины.
- Есть некоторые темы, которые обновляют
outs
поля в соответствии с содержанием в реальном времени аудиовходов полей. - Есть некоторые темы, которые меняют
ins
поля согласноenc
значение и некоторые другие внешние факторы. - Существует уникальная тема, которая обновляет
enc
путем добавления/вычитанияHP
илиLP
в соответствии с выходными и входными потоками. - Есть и другие темы, которые читают значение
enc
и принимают решения для других частей программы или для измененияouts
. - Очень важно, чтобы все эти данные были доступны для чтения/записи максимум через 40 мс. В противном случае будут некоторые аномалии.
Что вы подразумеваете под «безопасным»? 'volatile 'гарантирует только то, что поток чтения' ins' или 'outs' будет видеть самое последнее значение, записанное в переменную. Это не то же самое, что безопасность. –
, если он обрабатывает логические элементы массива в виде булевых переменных, то этого достаточно. Поскольку операция над булевым var является атомарной. Я либо пишу, либо читаю истину или ложь! @ChrisHayes btw, я отредактировал вопрос и добавил примечание. – Johnny
Атомные операции - это операции, которые поддерживаются процессором как атомарные. У вас есть массив и, например, ins [x] = y; не является атомной операцией. Если вы укажете немного больше того, что вы хотели бы сделать с структурой данных, можно было бы сказать, достаточно ли волатильности, было бы лучше использовать что-то из java.concurrency. – JosefN