Почему в реализации Scala Actor используется синхронизированный код? - PullRequest
2 голосов
/ 02 мая 2011

Насколько я понимаю, подход к параллелизму на основе очереди может быть реализован без блокировки. Но я вижу много синхронизированных ключевых слов в файле Actor.scala (см. 2.8.1). Синхронизировано ли это, необходимо ли это, если бы была реализация, которая не была синхронизирована?

Видимо, вопрос был недостаточно ясен: я понимаю, что это можно реализовать с неблокирующей очередью. Почему этого не было сделано? Зачем использовать синхронизированное ключевое слово где-нибудь здесь? Там может быть очень веская причина, или это может быть просто потому, что так было сделано, и в этом нет необходимости. Мне было просто любопытно, что.

1 Ответ

3 голосов
/ 02 мая 2011

Дело в том, что реакции, которые вы пишете в методе "act", не должны касаться синхронизации.Кроме того, при условии, что вы не выставляете состояние актера, ваша программа будет полностью поточно-ориентированной.

То есть , а не , чтобы сказать, что синхронизация вообще отсутствует: синхронизацияАбсолютно необходимо [1] реализовать доступ на чтение / запись к почтовому ящику субъекта (т. е. отправку и получение сообщений) и также для обеспечения согласованности личного состояния субъекта при любых последующих реакциях.

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

[1] - под «синхронизацией» я подразумеваю некоторый механизм, гарантирующий отношения «происходит до» в модели памяти Java.Это включает ключевое слово synchronized, модификатор volatile и / или java.util.concurrent блокирующие примитивы

...