I am wondering which one is better in practice in a multithreaded environment. I understand Singleton as Enum type creates an instance when the class is loaded. Other than that I don’t see anything else significant. Is there any pros and cons ?
Singleton as Enum type:
public enum Singleton {
INSTANCE;
public void doSomething(){ ... }
}
Singleton with double-checked locking:
public class Singleton{
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
Often in multi-threaded applications, simpler, easier to understand code is more likley to work.
To my mind the first example is significantly simpler than the second and that is what matters.
The main pro of using an
enumis its much simpler and the more complicated example is not justified. The double locking example allows you to change the singleton in interesting way for unit tests, but I believe what this gives you can be solved another way.