2013-12-24 1 views
0

Интересно, является ли следующая структура безопасной нитью. Я знаю, что я должен синхронизировать все обращения к 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 мс. В противном случае будут некоторые аномалии.
+1

Что вы подразумеваете под «безопасным»? 'volatile 'гарантирует только то, что поток чтения' ins' или 'outs' будет видеть самое последнее значение, записанное в переменную. Это не то же самое, что безопасность. –

+0

, если он обрабатывает логические элементы массива в виде булевых переменных, то этого достаточно. Поскольку операция над булевым var является атомарной. Я либо пишу, либо читаю истину или ложь! @ChrisHayes btw, я отредактировал вопрос и добавил примечание. – Johnny

+1

Атомные операции - это операции, которые поддерживаются процессором как атомарные. У вас есть массив и, например, ins [x] = y; не является атомной операцией. Если вы укажете немного больше того, что вы хотели бы сделать с структурой данных, можно было бы сказать, достаточно ли волатильности, было бы лучше использовать что-то из java.concurrency. – JosefN

ответ

2

Выполняет ли volatile синхронизацию массива атомных типов данных?

No. Однако, ваш пример не использует атомные типы данных.

Интересно, является ли следующая структура безопасной нитью (sic).

Нет, это не так. Существует множество способов доступа или обновления этой структуры данных, которые не были бы потокобезопасными.

Интересно, должен ли я объявить их окончательными?

Это было бы неплохо, но это не делает потоки безопасными для массивов.


Если вы хотите достичь поточно-доступа и обновления массива (без использования synchronized), вы должны смотреть на атомных классах массива. Их три: AtomicIntegerArray, AtomicLongArray и AtomicReferenceArray. Вы также могли бы использовать обычные (несинхронизированные) массивы AtomicBoolean ... при условии, что массив был безопасно опубликован в потоки и никогда не обновлялся ими.

Но мне непонятно, что атомные массивы, «случайным образом» измененные множеством потоков, будут полезны для ваших целей. Для начала атомные массивы не обеспечивают способ получения согласованного моментального снимка массива для целей анализа. Единственный способ добиться этого - «приостановить» или «остановить» все потоки, пока ваш (гипотетический) код исследует атомный массив.

Если вам нужно получить согласованные снимки без явной остановки/приостановки всего, вам может быть лучше использовать , а не «атомные» типы.

+0

Их изменения случайны из этой части вопроса. Я должен реализовать тысячи строк, чтобы имитировать их поведение. FYI. они являются портами этого устройства http://www.phidgets.com/products.php?product_id=1012 – Johnny

+0

Вы хотите сказать, что я должен использовать синхронизированные getIns() или синхронизированные getIns (int i)?/Я имею в виду то же самое для сеттеров. Однако я отмечаю, что правильное моделирование будет для getIns (int i), потому что библиотеки phidgets имеют только этот вид метода. – Johnny

+1

@Johnny - Мне кажется, вам действительно нужно получить копию «Java Concurrency In Practice» от Goetz et al. (Я заметил загружаемый PDF, когда я искал его ...) –

Смежные вопросы