Let’s see how we can apply Joshua Bloch’s Effective Java in the Kotlin world. Today’s topic is Concurrency.
Item 78: Synchronize access to shared mutable data
In Kotlin, there is no longer the synchronized nor volatile keyword. Instead, it provides the following:
- The synchronized() inline function to run the block of code while holding the monitor of the given lock.
- The @Synchronized annotation to mark the annotated function as synchronized.
- The @Volatile annotation to mark the annotated property as volatile.
- The Mutex class for coroutines.
Item 79: Avoid excessive synchronization
There is nothing special in Kotlin for this item.
Item 80: Prefer executors, tasks, and streams to threads
In Kotlin, we can use coroutines and flows.
Item 81: Prefer concurrency utilities to wait and notify
In Kotlin, the root class Any no longer provides wait() nor notify(). However, if you really need to call them, you can try something like this.
Item 82: Document thread safety
There is nothing special in Kotlin for this item.
Item 83: Use lazy initialization judiciously
In Kotlin, we can use the lazy() delegate to lazily initialize properties in a thread-safe way.
Item 84: Don’t depend on the thread scheduler
There is nothing special in Kotlin for this item.