单例模式的几种实现-Java版

关键点

  1. 私有化构造器
  2. 通过静态方法或枚举返回单例类对象
  3. 确保单例类对象只有一个,尤其在多线程环境下。
  4. 确保每个类被序列化不会重新创建对象

饿汉式

/*
饿汉式
 */
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){};
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式

懒汉式缺点:
第一次加载需要及时进行实例化,反应稍慢
每次调用getInstance都会进行同步,造成不必要的同步开销

 /*
 懒汉式
  */
public class Singleton {
    private static Singleton instance = null;
    private Singleton(){};
    public static synchronized Singleton getInstance() {
        if (instance == null)
            instance = new Singleton();
        return instance;
    }
}

双检锁

  /*
  双检索 CAS
   */

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton(){};
    public static Singleton getInstance() {
        if ( instance == null ) {
            synchronized (Singleton.class) {
                if (instance == null)
                    instance = new Singleton();
            }
        }

        return instance;
    }
}

静态内部类单例模式

优点:

第一次加载Singleton类并不会初始化instance,只有在第一次调用getInstance
方法时才会导致instance被初始化(延迟加载)。这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性(利用Classloader的特性),同时也延迟了单例的实例化,所> 以这是推荐使用的单例模式实现方式。

//静态内部类单例模式
public class Singleton {
    private Singleton(){};
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }
}

枚举方式

public enum Singleton {
    INSTANCE;
}
//==========完整代码===
// 定义单例模式中需要完成的代码逻辑
public interface MySingleton {
    void doSomething();
}

public enum Singleton implements MySingleton {
    INSTANCE {
        @Override
        public void doSomething() {
            System.out.println("complete singleton");
        }
    };

    public static MySingleton getInstance() {
        return Singleton.INSTANCE;
    }
}
posted @ 2017-09-14 19:38  一弓一土两亩田  阅读(242)  评论(0编辑  收藏  举报