Daily Coding Problem: Problem #726

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

 

posted @ 2020-11-28 11:13  johnny_zhao  阅读(73)  评论(0编辑  收藏  举报