Thread.run()
А правда, что если перед выходом из run() код изменяет поле некого объекта, то другие треды могут не увидеть изменённое значение? Например:
[main] MyThread.stopped=false
[main] MyThread.stopped=false
[main] MyThread.stopped=false
[MyThread] Before set
[MyThread] After set
[main] MyThread.stopped=false
[main] MyThread.stopped=false
...
Если написать такой тест голый, то всё нормально, но вот именно в существующей большой системе у меня именно такой глюк. Чем-то это объясняется? Понятно, может я сам накосячил, но не раз и не я один код перепроверил и по-всякому переписывал.
Мне один чел сказал такую вещь: возможно после смерти треда чё-то в памяти перестаёт синхронизироваться. Но *в* момент смерти же такая синхронизация должна происходить, исходя из здравого смысла?
P.S. JDK 1.6, Win XP 32.
public class MyThread extends Thread {
private final Log log = LogFactory.getLog(getClass());
public volatile boolean stopped = false;
public MyThread() {
super("MyThread");
}
public void run() {
// ...
this.log.debug("Before set");
this.stopped = true;
this.log.debug("After set");
}
}Другой тред в цикле раз в секунду пишет в лог чему равно это поле stopped. В результате лог такой:[main] MyThread.stopped=false
[main] MyThread.stopped=false
[main] MyThread.stopped=false
[MyThread] Before set
[MyThread] After set
[main] MyThread.stopped=false
[main] MyThread.stopped=false
...
Если написать такой тест голый, то всё нормально, но вот именно в существующей большой системе у меня именно такой глюк. Чем-то это объясняется? Понятно, может я сам накосячил, но не раз и не я один код перепроверил и по-всякому переписывал.
Мне один чел сказал такую вещь: возможно после смерти треда чё-то в памяти перестаёт синхронизироваться. Но *в* момент смерти же такая синхронизация должна происходить, исходя из здравого смысла?
P.S. JDK 1.6, Win XP 32.
