弱参照とラムダ式

突然ですがクイズです!

以下のコードを実行した時の出力は何になるでしょうか?

cvlspm5vyaa02hs

  1. truetrue
  2. falsefalse
  3. falsetrue
  4. truefalse

簡単にコードの解説をするとWeakReferenceは引数に渡しているインスタンスに強参照(普通にJava書いてるときの参照)をしているものが無くなるとGC対象になるよ!ってものです。a, bには匿名クラスとラムダ式を渡して、即GCしています。

回答

cvlucqoukaazls0 答え: 4

ラムダ式に強参照してるやつがいる・・・?どういうことだ???


解説

ラムダ式は匿名クラスに変換されるわけではなく、invokedynamic命令で実行されています。どうやらそのへんで違いが出ていそうです。 ラムダ式の実装を調べるとわかりそうです。

メンションで教えてもらった資料を見ると39ページから答えが書いてあります。

  1. invokedynamic命令を使うと、どのようにクラスを作りインスタンスをどのように作るかの制御ができる
  2. ラムダ式を作るなら外部の変数を使用していない場合毎回作らなくてもシングルトンで良いのでは?

ということでWeakReferenceに渡していたインスタンスはシングルトンになっていたためGCされなかったんですね。なるほど。


ところで外部の変数を使用していない場合はシングルトンになるという話でした。つまり外部の変数を使用するラムダ式なら結果は変わるのでしょうか?


問題の元ネタ

ちなみに、問題の元ネタは匿名クラスとラムダ式と時々弱参照をクイズ形式にしたものです。 何も知らずにこの問題にハマるとびっくりするよね!

*1:)->System.out.println("c"+hoge"