是什么让安全调用(问号)与经典 if 的解释不同?

What makes safe call (question mark) to be interpreted differently from classic if?

Kotlin 中,如果我们将 class 成员声明为 varnullable 类型,编译器不允许我们 运行 成员函数,尽管我们在调用函数之前放置了一个 if 语句,因为编译器不能保证在检查 null 后该成员没有被设置为 null在调用方法之前。 但是 如果我们使用安全调用 编译器会批准我们的代码。 我的问题是,编译器如何使安全调用成为原子的?不是第二个线程可以在检查 null 和调用方法(示例中的 eat 方法)之间更改变量吗? 第一种情况代码:

        class MyWolf
{
    var w : Wolf? = Wolf()
    
    fun myFunction()
    {
        if (w != null)
        {
            w.eat()
        }
    }

}

class Wolf
{
    fun eat() : Unit
    println("wolf is eating")
}

第二种情况代码:

    class MyWolf
{
    var w : Wolf? = Wolf()
        
    fun myFunction()
    {
        w?.eat()
    }
}

class Wolf
{
      fun eat():Unit
    {
        //code
    }
}

编译器将字段的内容放入局部变量中,然后与null进行比较。反编译Kotlin字节码就可以清楚的看到