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)
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |