2017-02-17 5 views
0

Я создаю игру с использованием java и в какой-то момент создаю поток для инициализации класса, который инициализирует другие классы и т. Д. После этого я и поток неактивен, мой основной поток обращается к инициализированному классу I и вызывает метод, который использует переменные, инициализированные с помощью другого потока, который затем вызывает методы другого класса, которые имеют переменные, инициализированные другой нитью и т. д.Многопоточность -Как вы должны инициализировать переменные без постоянного использования измененного ключевого слова

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

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

Кроме того, если это помогает, моя программа имеет объектно-ориентированную структуру.

+0

Зачем использовать отдельный поток для инициализации переменных? – Kayaman

+0

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

+1

Нет, вы не должны делать все переменные неизменными. Вместо этого вы можете создать отдельный поток для анимации экрана загрузки, и когда инициализация будет готова, просто остановите этот поток и продолжайте нормально. Теперь у вас это немного назад. – Kayaman

ответ

0

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

Вам не нужно ничего делать, чтобы сделать объект или элементы объекта видимыми для других потоков.

+0

* «Вы не используете ключевое слово volatile, чтобы сделать видимыми переменные для других потоков». * ... как это происходит, именно поэтому вы используете ключевое слово 'volatile'. Модификатор 'volatile' обеспечивает слабую форму безопасности потоков, обеспечивая видимость, но сам по себе ничего не дает для атомарности или взаимного исключения ... и, таким образом,' volatile' на самом деле не может гарантировать связь «когда-либо», когда состояние объекта состоящий из более чем одного поля. – scottb

+0

* «Вам не нужно делать ничего особенного, чтобы сделать объект или элементы объекта видимым для других потоков.» * ... это необратимо и бесспорно ложно. – scottb

+0

@scottb 'volatile' не обеспечивает видимость поля для других потоков. Он обеспечивает видимость _changes_ этой переменной для других потоков. Можете ли вы предоставить ссылку на резервное копирование того, что вы здесь говорите? – Neatname

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