2010-03-17 12 views
13

Il modello di memoria Java (dalla versione 1.5) tratta i campi final in modo diverso nei campi non- final. In particolare, a condizione che il riferimento this non scappi durante la costruzione, le scritture nei campi final nel costruttore sono garantite per essere visibili su altri thread anche se l'oggetto è reso disponibile all'altro thread tramite una corsa di dati. (Non è garantito che i campi non final siano visibili, quindi se li pubblichi impropriamente, un altro thread potrebbe vederli in uno stato parzialmente costruito.)Scala e modello di memoria Java

C'è qualche documentazione su come/se il compilatore Scala crea final (anziché non final) campi di supporto per le classi? Ho esaminato le specifiche del linguaggio e ho cercato nel web ma non ho trovato nessuna risposta definitiva. (In confronto la @scala.volatile annotazione è documentato per contrassegnare un campo come volatile)

risposta

4

ho scavato attraverso la storia per sapere quando il cambiamento è stato fatto.

La proiezione di Scala nella JVM non è coperto dalla specifica del linguaggio.

+7

Ma il comportamento, dal punto di vista della concorrenza, dei costrutti del linguaggio dovrebbe essere parte delle sue specifiche, direi! –

3

Si crea un campo final quando si dichiara qualcosa come val. Qualunque cosa i cui riferimenti possono essere modificati, come ad esempio var, non può (ovviamente) essere final sotto.

Questo significa che case classes contengono campi finali anche (come gli argomenti a un costruttore di classe caso sono implicitamente val s)

+1

Non penso che sia il caso (vedere http://old.nabble.com/Val-and-Final-td13355515.html per esempio). Parte della ragione della mia domanda: se questo può cambiare senza alcuna documentazione, come faccio a sapere che non cambierà più? –

+1

Hai ragione che questo dovrebbe essere stato documentato. Questo non è solo un problema di prestazioni, ma parte del linguaggio stesso a causa del modello di memoria. Non ero a conoscenza del fatto che vals fosse non-finale –

2

Ho archiviato un bug di documentazione nel sistema Scala bug.

Problemi correlati