【问题标题】:Are Kotlin object/singleton's methods synchronized?Kotlin 对象/单例的方法是否同步?
【发布时间】:2016-05-23 08:28:17
【问题描述】:

@Synchronized 注释添加到对象的方法以使其成为原子方法或不需要它是否有意义?

例如:

object Singleton {

    var field1: Int = 0
        private set

    var field2: Int = 0
        private set

    @Synchronized fun updateFields(f1: Int, f2: Int) {
        field1 = f1
        field2 = f2
    }

}

我想确保在从其他对象中读取所有字段时更新它们。我应该保留@Synchronized 注释吗?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    如果您希望实现 @Synchronized 语义,您需要明确添加它 - 就像您的示例一样。

    object Singleton {} 在这件事上与使用例如创建的对象没有什么不同。 val obj = Singleton().

    另一种确保字段同步的方法是对其进行显式建模,例如:

    object Singleton {
        @Volatile var state = State(0, 0)
    
        val field1: Int get() = state.field1
        val field2: Int get() = state.field2
    
        data class State(val field1: Int, val field2: Int)
    }
    

    并使用Singleton.state = Singleton.state.copy(field2 = 3) 更新值。这显然与@Synchronized 的行为不完全相同,但在调用方更明确地表明值是同步的。

    【讨论】:

    • 谢谢@miensol。但是,如果我的示例(带有注释)是正确的,我将保留它,因为您的示例在有很多字段时会使代码的可读性复杂化。
    • @nitrico 这只是一个建议。请注意,val field1: Int get() = state.field1 在我的示例中是多余的,因此即使有很多字段,在代码大小方面与您的示例也几乎没有区别。
    • 但是它们应该在两个地方(单例本身和内部类)。无论如何,我问了,因为我读了singletons are thread-safe in Kotlin,但不知道这是否意味着我试图实现的目标。
    • @nitrico 'Kotlin "object" is thread-safe by construction' 这就是答案所说的——即:创建单例对象实例是线程安全的。
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2021-03-05
    • 2019-10-10
    相关资源
    最近更新 更多