У меня есть общие сомнения относительно публикации данных и изменений данных в потоках.
Рассмотрим для примера следующий класс.
public class DataRace {
static int a = 0;
public static void main() {
new MyThread().start();
a = 1;
}
public static class MyThread extends Thread {
public void run() {
// Access a, b.
}
}
}
Позволяет сфокусироваться на main ().
Ясно
new MyThread().start();
a = 1;
Там мы меняем переменную общего доступа a после запуска MyThread и, следовательно, не можем быть потокобезопасной публикацией.
a = 1;
new MyThread().start();
Однако на этот раз изменение a безопасно публикуется в новом потоке, поскольку спецификация языка Java (JLS) гарантирует, что все переменные, которые были видны потоку A при запуске потока B, видны потоку B, фактически как неявная синхронизация в Thread.start ().
new MyThread().start();
int b = 1;
В этом случае, когда новая переменная выделяется после того, как оба потока были созданы, есть ли гарантия, что новая переменная будет безопасно опубликована во всех потоках. т.е. если к var b обращается другой поток, гарантированно ли он будет видеть его значение как 1. Обратите внимание, что я не говорю о каких-либо последующих модификациях b после этого (что, безусловно, должно быть синхронизировано), но первое распределение сделано от JVM.
Спасибо