2016-05-23 3 views
3

Имеет ли смысл добавить аннотацию @Synchronized методам объекта, чтобы сделать их атомарными или не нужно?Являются ли методы объекта Kotlin/Singleton синхронизированными?

Например:

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?

ответ

2

Если вы хотите получить семантику @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, но более явственно на стороне вызывающего абонента, что значения должны быть синхронизированы.

+0

Спасибо @miensol. Но если мой пример (с аннотацией) прав, я оставлю его так, потому что ваш усложнит читаемость кода при наличии большого количества полей. – nitrico

+0

@nitrico Это было всего лишь предложение. Обратите внимание, что 'val field1: Int get() = state.field1' является избыточным в моем примере, поэтому даже с большим количеством полей в вашем примере будет мало различий по размеру кода. – miensol

+0

Но они должны быть в двух местах (сам синглтон и внутренний класс). В любом случае, я спросил, потому что я читал, что [синглтоны являются потокобезопасными в Котлине] (http://stackoverflow.com/questions/30179793/are-kotlins-singletons-thread-safe), но не знал, означает то, что я пытаюсь достичь. – nitrico

Смежные вопросы