ThreadLocal имеет странное поведение при использовании в области анонимного итератора - PullRequest
0 голосов
/ 23 июня 2011

У меня есть внутренний класс, который реализует Iterable с помощью метода, подобного следующему:

public Iterator iterator() {
    return new Iterator() {
        Foo foo = fooThreadLocal.get();
        int bar = foo._bar;
        void baz() {
            System.out.println("" + bar);
            System.out.println("" + foo);
        }
        public Object next() {
            baz();
            ...
        }
    }
}

Странно (для меня), в некоторых случаях значение foo внутри baz равно нулю, но значение bar равно 0 (исключение нулевого указателя при инициализации поля). Кроме того, странно, что поле имеет нулевое значение в первую очередь, поскольку, если я печатаю трассировку стека, происходит вызов метода set ThreadLocal, который устанавливает его значение для вновь созданного объекта Foo, но это может быть другой проблемой. .

Кто-нибудь знает, что здесь может происходить?

1 Ответ

0 голосов
/ 20 мая 2012

ОК, я разобрался (наконец, после часов отладки). Я звонил в базу, когда другое поле инициализировалось. Мои глаза просто пропускали следы стека (много раз). Тьфу ... Спасибо за всю помощь, особенно за наблюдение, что то, что я видел, было ожидаемым поведением, если эти поля еще не были инициализированы.

...