单例模式,可能是所有开发人员都了解的一种设计模式,但是又有大部分人对单例模式只是仅仅会用,这个对于求知欲极强的我来说怎么可能, 那么一定要把它搞明白了。
单例模式定义: 保证一个类中只存在一个对象实例,并提供一个唯一的访问点
单例模式说来就话长了,因为他有好多种写法,下面我要一一列举出来。 Come On!
1.饿汉模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance{
return instance;
}
}
这种方式叫做饿汉式,这种方式在类加载的时候就完成了初始化操作,所以类加载起来会慢,但是获取对象的速度就会变快。 这种方式避免了多线程的同步操作问题。
2.懒汉模式(线程不安全)
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉模式申明了一个静态对象,在用户第一次调用时初始化,虽然节约了资源,但第一次加载时需要实例化,反映稍慢一些,而且在多线程不能正常工作。
3.懒汉模式(线程安全)
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这种模式。
4. 静态内部类单例模式
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static final Singleton sInstance = new Singleton();
}
}
第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。
5. 枚举单例
public enum Singleton {
INSTANCE;
public void doSomeThing() {
}
}
####总结####
常用的一些单例模式基本上都讲完啦, 大家有什么问题可以在下面留言。设计模式打算做成一个系列,也算是自己做一些笔记,一举两得。