次のようなメソッドで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内でnullですが、barの値は0です(フィールドが初期化されるときにnullポインター例外はありません)。また、スタックトレースを出力すると、新しく構築されたFooオブジェクトで値を設定するThreadLocalのsetメソッドが呼び出されるため、そもそもフィールドがnullであるのは奇妙ですが、これは別の問題である可能性があります。 。
ここで何が起こっているのか誰か知っていますか?