[英]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.