Сброс кэша на CyclicBarrier или CountDownLatch, как при использовании синхронизированного ключевого слова - PullRequest
2 голосов
/ 21 сентября 2011

Есть ли какой-нибудь способ, как гарантировать, что java сбрасывает кэш записей, которые были сделаны до того, как CyclicBarrier или CountDownLatch позволят нам продолжить (как это делает ключевое слово synchronized) без использования ключевого слова synchronized?

1 Ответ

3 голосов
/ 21 сентября 2011

Я думаю, что это уже гарантировано API.

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CyclicBarrier.html

Эффекты согласованности памяти: действия в потоке перед вызовом await () случай-до действия, являющиеся частью действия барьера, которые, в свою очередь, выполняются до действий после успешного возврата из соответствующего await () в другие потоки.

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

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


Это означает

thread 1                  thread 2

write x1;                 write x2
barrier.await();          barrier.await();
read x2                   read x1

, дополнительная синхронизация не требуется;read x2 увидит результат write x2

...