Scala and the Java Memory Model

concurrency, final, java-memory-model, scala

Solution

I dug through the history to find out when the change was made.

- Bug Report October 2007

- Commit November 2007

The projection of Scala into the JVM isn't covered by the language specification.

Problem

The Java Memory Model (since 1.5) treats `final` fields differently to non-`final` fields. In particular, provided the `this` reference doesn't escape during construction, writes to `final` fields in the constructor are guaranteed to be visible on other threads even if the object is made available to the other thread via a data race. (Writes to non-`final` fields aren't guaranteed to be visible, so if you improperly publish them, another thread could see them in a partially constructed state.) Is there any documentation on how/if the Scala compiler creates `final` (rather than non-`final`) backing fields for classes? I've looked through the language specification and searched the web but can't find any definitive answers. (In comparison the `@scala.volatile` annotation is documented to mark a field as `volatile`)

Original source