В Java, при использовании объекта в нескольких потоках (и вообще), хорошая практика - сделать поля окончательными. Например,
public class ShareMe {
private final MyObject obj;
public ShareMe(MyObject obj) {
this.obj = obj;
}
}
В этом случае видимость obj будет согласованной между несколькими потоками (пусть предполагается, что obj имеет все конечные поля), так как он безопасно построен с использованием ключевого слова final.
В scala он не выглядит val компилируется до окончательной ссылки, но val является семантикой в scala, которая препятствует переназначению переменной (Scala конечные переменные в конструкторе). Если переменные конструктора scala не определены как final, они будут страдать от одной и той же проблемы (при использовании этих объектов у участников)?