[英]Kotlin Concurrency: mark a class as synchronized
我有一个处理HTTP请求的类。 该类没有理由被多个线程使用,因此我想使其完全同步。
我之所以不简单地让该类不同步,是因为它包含该类型的多种用法:
if (jsonOutput != null) {
// ...
jsonOutput!!.writeTo(PrintWriter(writer))
// ...
}
注意,我正在使用!!
空检查中的运算符,在Kotlin中不需要。 编译器强迫我添加它,因为“ jsonOutput是一个可变的属性,这次可能已经更改了”。
以我的理解,这意味着编译器担心其他线程可能会修改此类属性的值。 但是,在这种情况下,此类的给定对象将永远不会被多个线程使用,因此对运算符的此调用是毫无意义的,并且会使代码混乱。
如何仅从一个线程使类的对象可用?
我曾考虑过将@Synchronized添加到每个方法中,但是1.听起来很麻烦,与Kotlin不同,并且2.我不知道编译器是否会认为这足以证明它不能被修改。
以我的理解,这意味着编译器担心其他线程可能会修改此类属性的值。 但是,在这种情况下,此类的给定对象将永远不会被多个线程使用,因此对运算符的此调用是毫无意义的,并且会使代码混乱。
不只是其他线程,而且在第一// ...
部分中发生的任何方法调用都可能jsonOutput
设置为null
。
无论如何,使用@Synchronized
注释确实无济于事,但出于同样的原因,也不会“将类标记为已同步”。
但是,解决问题的正确方法有所不同:
jsonOutput?.let {
// ...
it.writeTo(PrintWriter(writer)) // it refers to jsonOutput value
// ...
}
这得到jsonOutput
的价值只有一次,所以编译器知道它不是null
内let
。 您还可以命名参数:
jsonOutput?.let { jsonOutput ->
// ...
jsonOutput.writeTo(PrintWriter(writer))
// ...
}
如果您嵌套了null检查(或者只是块很大),这将很有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.