簡體   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