你可以使用同步的对象作为锁

时间:2017-11-16 11:27:14

标签: concurrency locking kotlin

此代码是否正常,还是应该创建单独的锁定对象?我在问是否有可能出现一些僵局或类似的事情。我认为它应该可以工作,因为语言允许它,但只是为了确保我宁愿理解它是如何工作的,为什么它是好的或为什么它不好。

var foo = false

fun bar()
{
    synchronized(foo) {
        foo = !foo
    }
}

1 个答案:

答案 0 :(得分:3)

您的代码以您可能没想到的方式被破坏。这是它生成的字节码的简化版本,反编译为Java:

private static boolean foo;

public static final void bar() {
    Boolean var0 = Boolean.valueOf(foo);
    synchronized(var0) {
        foo = !foo;
    }
}

所以你基本上锁定valueOf函数返回的任何对象,在我的JRE中,TRUE类中的FALSEBoolean单例(这个也简化了):

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实例来进行同步。