Kotlin:"synchronized"使编译器无法确定变量的初始化

Mar*_*rio 6 synchronized thread-safety kotlin

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

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

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

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

...我得到了一个"变量'结果'必须初始化".看起来该synchronized块充当条件块,但您可以确定它将在while块之前执行一次.

我在Java中实现了这个相同的块,但我没有得到错误.这是Kotlin的设计/实现错误吗?或者它有充分的理由表现得那样吗?

Ily*_*kov 16

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

val results =
  synchronized(preparedStatement) {
    preparedStatement.clearParameters()
    preparedStatement.setInt(1,value1);
    preparedStatement.setInt(2,value2)
    preparedStatement.executeQuery()
  }
Run Code Online (Sandbox Code Playgroud)