今Javaビーム工房の作り直しをしていて、その中でWeakReferenceを使ったObserverパターンを書いた。

やりたいことは大体こんな感じ。

これは参照されなくなった時にGCされるとリスナが呼び出されなくなるって感じの挙動になる。
実行するとAAAだけ出力されてGCされた後のBBBは出力されない。

これ使えばリスナの解除を忘れてた時もメモリリークしにくくなると思ったけど思った通りに動作しなかった。
さっきのコードでは問題なく動いているけど、ラムダでaddListenerをするとGCしても参照が消えない。
そこで書いてみたのがこのコード

匿名クラスを使用しているときは問題なく消えてるけど、ラムダを使った時は残ったままだし消えない。
匿名クラスとラムダが違うというのは聞いたことあったけど、こんなところで違いが出てくるとは思わなかった。原因はなんなんだろう・・・?