コードが予期しないように壊れています。ここではJavaへの逆コンパイル、それが生成するバイトコードの簡易版は、です:
private static boolean foo;
public static final void bar() {
Boolean var0 = Boolean.valueOf(foo);
synchronized(var0) {
foo = !foo;
}
}
だから、基本的にどんなオブジェクトに私のJREにBoolean
クラス内部TRUE
またはFALSE
シングルトンのいずれかであるvalueOf
機能リターンを、ロックしています(これも簡略化されている):
public class Boolean {
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean var0) {
return var0 ? TRUE : FALSE;
}
}
特定、ランタイムに依存しないコードのための最善の策は、上の同期するためにAny
の別のインスタンスを作成することが考えられます。
どのように意見に基づいていますか?受け入れられた答えは意見ではなく、なぜロックと同じオブジェクトを持つことが危険なのかを説明します。 – rozina