import java.util.concurrent.atomic.AtomicInteger /** * This problem was asked by Microsoft. Implement the singleton pattern with a twist. First, instead of storing one instance, store two instances. And in every even call of getInstance(), return the first instance and in every odd call of getInstance(), return the second instance. * */ /* * Rules for making a class Singleton: * 1. A private constructor * 2. A static reference of its class * 3. One static method * 4. Globally accessible object reference * 5. Consistency across multiple threads * */ //in kotlin we need to use the object keyword to use Singleton class //饿汉式 object Singleton { } //懒汉式 class Singleton_ private constructor() { companion object { //lazy default is LazyThreadSafetyMode.SYNCHRONIZED private val firstInstance: Singleton_ by lazy { Singleton_() } private val secondInstance: Singleton_ by lazy { Singleton_() } private val counter = AtomicInteger(1) fun getInstance(): Singleton_ { return if (counter.getAndIncrement() % 2 == 0) firstInstance else secondInstance } } }