Поток отправки событий соответствует модели памяти Java

Это связано с более ранним вопрос Я спросил, где был ответ:

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

Кроме того, все, что управляет пикселями на экране, должно запускаться из события поток отправки, хотя при использовании repaint / paint это делается прозрачно.

Поэтому, насколько я понимаю, нам нужно беспокоиться о модели памяти для чего-то столь же простого, как анимация спрайта, движущегося по экрану.

У меня вопрос, правильно ли это понимание и примеры руководств Sun, например, TumbleItem (источник) неверный?


person Pool    schedule 05.12.2009    source источник


Ответы (4)


Знаешь, я думаю, ты прав. Код TumbleItem использует worker.isDone(), чтобы узнать, завершена ли работа. Однако я не думаю, что это вызывает полную «синхронизацию».

Я считаю, что код JDK 1.6 SwingWorker.isDone() использует FutureTask, который, в свою очередь, использует объект Sync с изменчивым атрибутом state. Путь выполнения для isDone(), похоже, не связан с synchronized методом или блоком.

Я не настоящий эксперт по новым параллельным классам, но думаю, что TumbleItem должен вызывать worker.get() в какой-то момент, чтобы гарантировать правильную синхронизацию.

РЕДАКТИРОВАТЬ: я имею в виду использование EDT массива img, который заполняется рабочим. Тем не менее, похоже, что существует проблема с использованием EDT параметров инициализации, как отмечает @The Feast.

person Stephen C    schedule 06.12.2009
comment
Я думаю, что если бы в примере использовались атомарные целые числа и т. Д., Это сработало бы. Я не вижу, чтобы эта проблема особо обсуждалась ни в одном учебном пособии (Sun или другом). - person Pool; 06.12.2009
comment
volatile имеет тот же эффект памяти, что и синхронизированный. - person irreputable; 06.12.2009
comment
Но ТОЛЬКО на изменчивой переменной, а не на всех остальных ... по крайней мере, я так понимаю. - person Stephen C; 07.12.2009

обычно:

  1. рабочий поток выполняет некоторые вычисления и достигает некоторых результатов.
  2. он вставляет событие в очередь событий
  3. поток событий извлекает событие и обрабатывает его
  4. во время процесса доступны результаты.

правильная синхронизация была сделана на шагах (2) и (3). поэтому результаты шага (1) можно увидеть на шаге (4). Подумайте, как бы вы реализовали очередь событий, и вы увидите.

person irreputable    schedule 05.12.2009

Чтобы узнать, когда вы нарушаете часть EDT (не прямой ответ на ваш вопрос, но тем не менее полезный :-).

person TofuBeer    schedule 05.12.2009

Я не уверен, что вы имеете в виду, говоря о неверном руководстве по Sun?

Анимация выполняется с помощью таймера качания. Когда срабатывает таймер, код выполняется на EDT, что означает, что он следует рекомендациям Swing.

Редактировать:

Да, ваше понимание верное, технически вам следует беспокоиться о модели памяти.

И да, «смещение» технически обновляется в двух разных потоках:

а) поток по умолчанию при загрузке апплета

б) EDT «однажды» анимация запущена.

Однако, на мой взгляд (и я могу стремиться к упрощению), когда апплет загружен, код выполняется в одном потоке, и все, что происходит, - это просто инициализируется значение смещения. Поскольку работает только один поток, вам не нужно беспокоиться о его обновлении из нескольких потоков одновременно.

Теперь, когда анимация началась, у нас другая ситуация, поскольку это значение используется графическим интерфейсом пользователя для управления анимацией и, следовательно, должно обновляться только кодом в EDT.

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

person camickr    schedule 05.12.2009
comment
offset, например, изменяется несколькими потоками. Я согласен, что это не нарушает никаких правил EDT. - person Pool; 06.12.2009