Image

Imageyvu wrote in Imageru_java

Category:

Thread.run()

А правда, что если перед выходом из run() код изменяет поле некого объекта, то другие треды могут не увидеть изменённое значение? Например:
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.