繁体   English   中英

Kotlin并发性:将类标记为已同步

[英]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的价值只有一次,所以编译器知道它不是nulllet 您还可以命名参数:

jsonOutput?.let { jsonOutput ->
    // ...
    jsonOutput.writeTo(PrintWriter(writer))
    // ...
}

如果您嵌套了null检查(或者只是块很大),这将很有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM