Kotlin: Is singleton thread safe? vs Object

Hitesh Dhamshaniya
2 min readJul 9, 2024

Singleton in Kotlin

In Kotlin, singletons are created using the object keyword. This ensures that only one instance of the object is created and used throughout the application.

object Singleton {
fun doSomething() {
// Implementation
}
}

Thread Safety of Kotlin Singletons

Kotlin singletons are inherently thread-safe. The Kotlin compiler ensures that the instance of the singleton object is created in a thread-safe manner when it is first accessed. This means that you don’t need to implement additional synchronization mechanisms to ensure the thread safety of your singleton instance.

object Singleton {
init {
// Initialization logic
}
fun doSomething() {
// Implementation
}
}

In the above example, the Singleton object will be initialized in a thread-safe manner. The init block will be executed only once, regardless of how many threads are trying to access the Singleton object.

Kotlin Objects and Thread Safety

An object in Kotlin is essentially a singleton. The thread safety properties discussed for singletons apply to all objects declared using the object keyword in Kotlin.

Differences between Singleton and Object

In Kotlin, there is no explicit “singleton” keyword; instead, the object keyword is used to create single-instance classes, which are effectively singletons. Hence, a Kotlin object is a singleton by nature, and both terms can be used interchangeably in Kotlin.

Example of an Object:

object NetworkManager {
fun sendRequest() {
// Send network request
}
}

Thread Safety of Kotlin Objects

As mentioned earlier, Kotlin ensures that the NetworkManager object is thread-safe when it is first accessed. You can safely call sendRequest() from multiple threads without worrying about the creation of multiple instances or concurrent initialization issues.

Thread Safety with Lazy Initialization

If you need more control over the initialization of your singleton, you can use Kotlin’s lazy delegation. This allows you to define custom initialization logic and ensure thread safety as per your requirements.

class MySingleton private constructor() {
companion object {
val instance: MySingleton by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
MySingleton()
}
}
}

In this example, the MySingleton instance is initialized lazily and in a thread-safe manner using LazyThreadSafetyMode.SYNCHRONIZED.

Conclusion

  • Kotlin singletons (created using the object keyword) are inherently thread-safe.
  • Kotlin objects are effectively singletons and share the same thread-safety properties.
  • Lazy initialization can be used for more control over the creation and initialization process, ensuring thread safety as needed.

Kotlin’s design makes it straightforward to create thread-safe singletons and objects, reducing the complexity and potential errors associated with manual synchronization.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Hitesh Dhamshaniya
Hitesh Dhamshaniya

No responses yet

Write a response

Recommended from Medium

Lists

See more recommendations