此代码是否正常,还是应该创建单独的锁定对象?我在问是否有可能出现一些僵局或类似的事情。我认为它应该可以工作,因为语言允许它,但只是为了确保我宁愿理解它是如何工作的,为什么它是好的或为什么它不好。
var foo = false
fun bar()
{
synchronized(foo) {
foo = !foo
}
}
答案 0 :(得分:3)
您的代码以您可能没想到的方式被破坏。这是它生成的字节码的简化版本,反编译为Java:
private static boolean foo;
public static final void bar() {
Boolean var0 = Boolean.valueOf(foo);
synchronized(var0) {
foo = !foo;
}
}
所以你基本上锁定valueOf
函数返回的任何对象,在我的JRE中,TRUE
类中的FALSE
或Boolean
单例(这个也简化了):
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
实例来进行同步。