/**
* 这里采用了双重校验的方式,对懒汉式单例模式做了线程安全处理。
* 通过加锁,可以保证同时只有一个线程走到第二个判空代码中去,这样保证了只创建 一个实例。
* 这里还用到了volatile关键字来修饰singleton,其最关键的作用是防止指令重排
*
*
* 指令重排可能导致未完全初始化的对象被发布,从而引发不正确的行为或者线程安全问题。
* 使用volatile关键字能够有效地解决这类问题,保证单例模式在多线程环境下的正确性。
*/
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
/**
* 饿汉式
*
* @return
*/
public static Singleton getInstance() {
if (null == instance) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
/**
* 通过枚举实现单例模式
* @param args
*/
public static void main(String[] args) {
SingletonHolder.INSTANCE.doSomething();
}
}
/**
* 通过枚举实现单例模式
*/
public enum SingletonHolder {
INSTANCE;
public void doSomething(){
System.out.println("doSomething");
}
}