In this post we are going to learn about the singleton design pattern . It is the most used design pattern in web applications . So if you write design pattern in your CV , then make sure you are familiarized with Singleton
Pattern . For experienced people ,the most common question asked by the interviewer is to write down the code of the Singleton Pattern . Let us discuss that first .
Points to remember while creating a singleton class
Suppose we are creating a singleton class JavaHungry . It means only one and only one instance of JavaHungry class we can have at any point of execution in the application code
* We should create a static variable so that it can hold one single instance of our class .
private static JavaHungrySingleton uniqueInstance ;
* We should declare the constructor private so that only Class itself can instantiate the object . Outside
classes will not be able to see the class constructor .
* Then the main work to write the method which returns the instance of the class , let the name of the
method be getInstance() .
Here in this method implementation we created the class JavaHungrySingleton .
The return type should be of the class object . But there is possibility that two threads simultaneously try to
access the method and we might end up with two different class objects , thats why method is synchronized . In other words , By adding synchronized keyword to the method , we force every thread
to wait for its turn before it can enter the method . So that , two threads do not enter the method at the
same time .
So we have set up the framework for the singleton method ,which upto now looks like
Now we need to write code for the method , that is line 1 //some code .
So to achieve uniqueinstance , first and foremost important thing to check whether the object of the class
is already in existence or not . We make sure , by putting condition
Pseudo code to achieve singleton
if uniqueinstance is NULL
then create the object of the class
else
return uniqueinstance ;
What above code is trying to achieve is to make sure there should be atmost one and only one instance of the class at any given time .
So , code in the method will be look like this
Interviewer may ask the Class diagram of the Singleton class you created , so below is the class diagram of the JavaHungrySingleton class .
So all the code summed up in the below JavaHungrySingleton Class
Now after writing the code , interviewer may asked to write the code using early initialization . To do that ,first we need to understand the difference between lazy initialization and early initialization .
Lazy Initialization : We create the object of the class only when it is about to use in the program code .
We are calling it lazy because we wait till the last moment to have an object.
Early Initialization : In this we create the object when the class is getting loaded into the JVM . Eager
intialization is helpful if our application always create and use the Singleton class .
//Code for the Early initialization will be :
There is third way to achieve singleton pattern while removing some overhead from the getInstance() method of the JavaHungrySingleton class .
If you have any doubts for singletondesign pattern ,mentioned it below in the comments .
Pattern . For experienced people ,the most common question asked by the interviewer is to write down the code of the Singleton Pattern . Let us discuss that first .
Points to remember while creating a singleton class
Suppose we are creating a singleton class JavaHungry . It means only one and only one instance of JavaHungry class we can have at any point of execution in the application code
* We should create a static variable so that it can hold one single instance of our class .
private static JavaHungrySingleton uniqueInstance ;
* We should declare the constructor private so that only Class itself can instantiate the object . Outside
classes will not be able to see the class constructor .
private JavaHungrySingleton(){}
* Then the main work to write the method which returns the instance of the class , let the name of the
method be getInstance() .
Here in this method implementation we created the class JavaHungrySingleton .
The return type should be of the class object . But there is possibility that two threads simultaneously try to
access the method and we might end up with two different class objects , thats why method is synchronized . In other words , By adding synchronized keyword to the method , we force every thread
to wait for its turn before it can enter the method . So that , two threads do not enter the method at the
same time .
So we have set up the framework for the singleton method ,which upto now looks like
public static synchronized JavaHungrySingleton getInstance() { 1. // some code }
Now we need to write code for the method , that is line 1 //some code .
So to achieve uniqueinstance , first and foremost important thing to check whether the object of the class
is already in existence or not . We make sure , by putting condition
Pseudo code to achieve singleton
if uniqueinstance is NULL
then create the object of the class
else
return uniqueinstance ;
What above code is trying to achieve is to make sure there should be atmost one and only one instance of the class at any given time .
So , code in the method will be look like this
if (uniqueInstance ==null ) { uniqueInstance=new JavaHungrySingleton(); } return uniqueInstance ;
Interviewer may ask the Class diagram of the Singleton class you created , so below is the class diagram of the JavaHungrySingleton class .
So all the code summed up in the below JavaHungrySingleton Class
public class JavaHungrySingleton { private static JavaHungrySingleton uniqueInstance; private JavaHungrySingleton(){} public static synchronized JavaHungrySingleton getInstance() { if (uniqueInstance ==null ) { uniqueInstance=new JavaHungrySingleton(); } return uniqueInstance ; } // other useful methods here }
Now after writing the code , interviewer may asked to write the code using early initialization . To do that ,first we need to understand the difference between lazy initialization and early initialization .
Lazy Initialization : We create the object of the class only when it is about to use in the program code .
We are calling it lazy because we wait till the last moment to have an object.
Early Initialization : In this we create the object when the class is getting loaded into the JVM . Eager
intialization is helpful if our application always create and use the Singleton class .
//Code for the Early initialization will be :
public class JavaHungrySingleton { private static JavaHungrySingleton uniqueInstance = new JavaHungrySingleton(); private JavaHungrySingleton(){} public static JavaHungrySingleton getInstance() { return uniqueInstance ; } // other useful methods here }
There is third way to achieve singleton pattern while removing some overhead from the getInstance() method of the JavaHungrySingleton class .
For 6-7 years or above experience , interviewer may ask about the double checked locking .
In double checked locking first we check if the object is created , if not then we create one using synchronized block.
Below is the best Optimized code for the Singleton pattern
public class JavaHungrySingleton { private static volatile JavaHungrySingleton uniqueInstance; private JavaHungrySingleton(){} public static JavaHungrySingleton getInstance() { if (uniqueInstance ==null ) { synchronized(JavaHungrySingleton.class) { if (uniqueInstance ==null ) { uniqueInstance=new JavaHungrySingleton(); } } } return uniqueInstance ; } // other useful methods here }
If you have any doubts for singletondesign pattern ,mentioned it below in the comments .