Переменная класса out
в классе MyThread должна быть объявлена изменчивой в этом коде или будет переноситься «изменчивость» переменной stdout
в классе ThreadTest?Должна ли эта переменная быть объявлена нестабильной?
import java.io.PrintStream;
class MyThread implements Runnable
{
int id;
PrintStream out; // should this be declared volatile?
MyThread(int id, PrintStream out) {
this.id = id;
this.out = out;
}
public void run() {
try {
Thread.currentThread().sleep((int)(1000 * Math.random()));
out.println("Thread " + id);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ThreadTest
{
static volatile PrintStream stdout = System.out;
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new MyThread(i, stdout)).start();
}
}
}
Эммм ... мое чтение модели памяти JLS spec заключается в том, что между созданием (энергонезависимым, не финальным) полем в конструкторе и чтением его в другом потоке не существует отношения «произойдет-до».Таким образом, в примере этот параметр не является избыточным. –
@Stephen C невозможно, чтобы другой поток мог получить доступ к переменной перед возвратом конструктора. –
Нет, если конструктор не произведет «необоснованно опубликованный» объект (не здесь). Но здесь мы говорим о другом потоке, обращающемся к переменной после возврата конструктора; то есть в методе «run». –