Происходит ли переходное состояние перед вызовом Thread.start()?
Допустим, у нас есть класс
class Foo {
int x;
Foo() {
x = 5;
}
}
и немного кода клиента
public static void main(String[] args) {
Foo foo = new Foo();
new Thread(() -> {
while (true) {
new Thread(() -> {
if (foo.x != 5) {
throw new AssertionError("this statement is false 1");
}
new Thread(() -> {
if (foo.x != 5) {
throw new AssertionError("this statement is false 2");
}
}).start();
}).start();
}
}).start();
}
Нельзя ли сгенерировать ошибку AssertionError, потому что событие before-before является транзитивным?
Несмотря на то, что x в Foo не является окончательным, из-за гарантии, которая происходит до того, как Thread.start(), вновь созданный поток из потока, который создал Foo, будет видеть все обновления вплоть до вызова Thread.Start().
Тем не менее, этот поток также порождает множество дочерних потоков, и, поскольку снова возникает отношение "происходит до", можем ли мы сказать, что из-за переходного свойства события "до" этот AssertionError никогда не может быть выдан?
1 ответ
Ваш вопрос:
Поскольку снова возникает отношение "происходит до", можем ли мы сказать, что из-за переходного свойства события "до" этот AssertionError никогда не может быть выдан?
Ответ - да. Как мы видим в разделе 17.4.5 JLS8. Бывает-до заказа:
- Если hb(x, y) и hb(y, z), то hb(x, z).
В том же разделе JLS также указано, что:
- Вызов
start()
в потоке происходит - перед любыми действиями в запущенном потоке.
Так что есть
- ро (
new Foo()
, первое действие в первом потоке) и - hb (поток первого действия в первом потоке, поток первого действия в первом утверждении)
- hb (поток первого действия в первом, поток первого действия во втором)
что означает, что есть также:
- ро (
new Foo()
, поток первого действия в первом утверждении) - ро (
new Foo()
, поток первого действия во втором утверждении)
(Поскольку "Для каждого потока t порядок синхронизации действий синхронизации (§17.4.2) в t соответствует порядку программы (§17.4.3) в t.", Я могу опустить промежуточные шаги, например while(true)
петля)