Scala и модель памяти Java - PullRequest
13 голосов
/ 17 марта 2010

Модель памяти Java (начиная с 1.5) обрабатывает поля final иначе, чем поля не final. В частности, при условии, что ссылка this не исчезает во время построения, записи в поля final в конструкторе гарантированно будут видны в других потоках, даже если объект сделан доступным для другого потока через гонку данных. (Запись в не final поля не гарантированно будет видимой, поэтому, если вы неправильно опубликуете их, другой поток может увидеть их в частично сконструированном состоянии.)

Есть ли документация о том, как / если компилятор Scala создает final (а не final) вспомогательные поля для классов? Я просмотрел спецификацию языка и искал в Интернете, но не могу найти никаких окончательных ответов. (Для сравнения, @scala.volatile аннотация задокументирована для пометки поля как volatile)

Ответы [ 3 ]

4 голосов
/ 17 марта 2010

Я покопался в истории, чтобы узнать, когда было сделано изменение.

Проекция Scala в JVM не указана в языковой спецификации.

3 голосов
/ 17 марта 2010

Создает поле final, когда вы объявляете что-то как val. Все, чьи ссылки могут быть изменены, например, var, может (очевидно) не быть final внизу.

Это означает, что case classes также содержит конечные поля (поскольку аргументы конструктора класса case неявно val s)

2 голосов
/ 28 марта 2010

Я отправил документацию об ошибке в системе Scala .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...