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
}
}
}