Re[6]: Запись в массив double-ов из нескольких потоков
От: Nicht Россия  
Дата: 11.05.11 07:26
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Nicht, Вы писали:


N>>В этом случае никто не гарантирует что результат записи потоков в этот массив будет виден в потоке, которые потом это дело читает. Вся запись поихайдет в локальном кэше процессора и без синхронизации кеша все может статься локально. Так что volatile таки нужен.

B>volatile будет действовать только на переменную, которая ссылается на весь массив. Даже если запись в массив кешировалась на потоке, это было бы важно только если бы происходило параллельное чтение. Чтение (по словам автора) происходит отдельным потоком после того как запись завершилась.

Ну если гарантирован syncronized order между записью и чтение, то конечно все пучком. Этого можно добится несколькими способами, вызвать Thread.join() на пример. В спеке все это сказано. Однако если ты юзаешь ThreadPool то поток как бы и не завершится и будет alive, и там нужно делать синхроназед ордер вручную. Стандартный способ это свезка записи и чтения в другую volatile переменную, а между ними свое действие. Ну или вопользоваться FutureTask, там сделано тоже самое через AbstractQueuedSynchronizer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.