私は java.util.concurrent パッケージのコードを読んでいますが、クラス Unsafe (これらのシンクロナイザーを実装するために使用される) が興味深いと思います。クラス名自体がそれを思いとどまらせるように見えるため、実際のコードで使用することは決してないかもしれませんが、好奇心から、このクラスについて2つの質問があります。
1)。このクラスのシングルトン アクセサーは次のようになります。
public static Unsafe getUnsafe() {
Class cc = sun.reflect.Reflection.getCallerClass(2);
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
}
したがって、このメソッドがユーザー コードから呼び出されると、例外がスローされます。これを回避するにはどうすればよいですか?(おそらく、ブートストラップクラスローダーによってロードされた独自のクラスを作成することによって可能ですか?これは可能ですか?)
2)。上記のコードはgetClassLoader
、boostrap クラスローダーによってロードされたクラスに対して null を返すことを前提としています。しかし、の javadoc にClass#getClassLoader
は、「一部の実装では、ブートストラップ クラス ローダーを表すために null を使用する場合があります」と記載されています。これは、この前提に保証がないことを意味します。この仮定に違反する実装の場合、Unsafe (およびそれに依存する ReentrantLock などのさまざまなクラス) はまったく機能しませんか?
ありがとう!