单例模式可以说是设计模式中最简单,也是应用最广泛的设计模式,所以很有必要学习一下
所谓单例模式,就是确保某一个类只有一个实例,而且能够自行实例化并向整个系统提供这个实例的设计模式。一般用于避免产生多个对象消耗过多的资源或者某种类型的对象必须独一无二的场景。
具体实现方式:
1).饿汉式
所谓饿汉式就是在声明对象的时候直接对其进行初始化
注意修饰符的使用
public class Single { private static final Single single = new Single(); private Single() { } public static Single getInstance() { return single; } }从代码中可以看出,我们不能通过正常的new形式的构造方法构造对象,只能通过类中提供的getInstance方法获取唯一静态对象
2).懒汉式
懒汉式与饿汉式不同的是它只有在第一次调用getInstance方法的时候才进行初始化
public class Single { private static Single single = null; private Single() { } public static synchronized Single getInstance() { if (single == null) { single = new Single(); } return single; } }我们可以看到代码中使用了synchronized关键字来修饰getInstance方法,synchronized关键字的主要作用是给方法加锁,当我在一个线程中调用刚该方法的时候回去检查其他线程中有没有调用该方法,如果有就等待,因此可以确保在多线程的情况下单例对象的独一无二性。
但是在第一次调用时进行初始化会拖慢速度,并且每次调用都会进行同步,会消耗不必要的资源,因此懒汉式并不是很好
3).DCL式
Double Check Lock双重检测锁,既实现了在需要的时候才初始化对象,又可以保证线程安全
public class Single { private volatile static Single single = null; private Single() { } public static Single getInstance() { if (single == null) { synchronized (Single.class) { if (single == null) { single = new Single(); } } } return single; } }通过双重锁的检测我们不仅可以确保多线程下对象独一无二,还避免了每次调用都会进行同步的问题,除了第一次初始化之外,每次调用geInstance方法进入第一个if判断就可以返回一个single对象。 4).静态内部类
一种更完美的单例模式实现方式
public class Single { private Single() { } /** * 类级的内部类,也就是静态类的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用时才会装载,从而实现了延迟加载 */ private static class SingletonHolder { // 静态初始化器,由JVM来保证线程安全 private static final Single instance = new Single(); } public static Single getInstance() { return SingletonHolder.instance; } }