thread-safety - Kotlin: "synchronized"使编译器不确定变量的初始化

标签 thread-safety synchronized kotlin

让我们想象下一段 Kotlin 代码通过 JDBC 连接器对数据库执行一些查询:

    var results : ResultSet
    preparedStatement.clearParameters()
    preparedStatement.setInt(1,value1);
    preparedStatement.setInt(2,value2)
    results = preparedStatement.executeQuery()
    while(results.next()) {
        // parse results
    }

编译没有问题。但是,当我尝试将线程安全添加到对preparedStatement 的访问时:

    var results : ResultSet
    synchronized(preparedStatement) {
        preparedStatement.clearParameters()
        preparedStatement.setInt(1,value1);
        preparedStatement.setInt(2,value2)
        results = preparedStatement.executeQuery()
    }
    while(results.next()) {
        // parse results
    }

...我得到一个“必须初始化变量'结果'”。似乎 synchronized block 充当条件 block ,但您可以确定它会在 while block 之前执行一次。

我已经在 J​​ava 中实现了这个相同的 block ,但我没有收到错误。这是 Kotlin 的设计/实现错误吗?还是有充分的理由这样做?

最佳答案

synchronized 只是一个内联函数,编译器不知道 lambda 是否会执行一次,甚至根本不会执行。惯用的方法是从 lambda 返回值并将其分配给本地:

val results =
  synchronized(preparedStatement) {
    preparedStatement.clearParameters()
    preparedStatement.setInt(1,value1);
    preparedStatement.setInt(2,value2)
    preparedStatement.executeQuery()
  }

关于thread-safety - Kotlin: "synchronized"使编译器不确定变量的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36246511/

相关文章:

kotlin - 如何将内容数据从属性文件读取到 Properties 对象?

c# - 发生故障时创建新的 ChannelFactory<T>

java - 我的 2 个线程在这里是生产者和消费者。当我运行程序时,它在removeFirst() 调用上抛出 nosuchelementexception。有人可以解释一下吗

java - "synchronized"在 Java 中是什么意思?

kotlin - 使用 Kotlin 和 Gradle 定位特定的 JVM

android - 如何在values/ids.xml中获取自定义id的引用

java - 如何使具有多个状态的类成为线程安全的?

python - 如何进行线程安全字典操作

java - FilterLock 锁定函数中的 java while 循环测试用例中的奇怪字符(向后 "E")

java - Java中是否继承了同步?