饿汉式:饿汉式是指,在类加载的时候即new出该类对象。
/**
* 饿汉式单例设计模式
* @author ligy
*
*/
class Single1 {
// final修饰符可有可无,有的话可有使代码更严谨
private static final Single1 s = new Single1();
public static Single1 getInstance() {
return s;
}
}
懒汉式:懒汉式是指,在第一次获取这个类的实例的时候才new这个对象。即可以延迟加载该对象实例。
/**
* 懒汉式单例设计模式
* 懒汉式单例设计模式在多线程同时初始化实例的时候有线程安全问题,
* 解决的方案是,加同步锁,使用同步方法和同步代码块都能解决问题。
* 然而多线程每次都访问锁,导致效率低下,所以使用同步代码块,然后以双重判断的形式来解决每次都判断同步锁导致的效率低下问题。
* 在这里锁使用的是该类的文件字节码对象。因为获取实例的方法时静态方法,使用锁选择类文件字节码对象。
* @author ligy
*
*/
class Single2 {
private static Single2 s = null;
private Single2() {
}
public static Single2 getInstance() {
if(s == null) {
synchronized (Single2.class) {
if(s == null) {
s= new Single2();
}
}
}
return s;
}
}
测试代码
public class SingleDemo {
public static void main(String[] args) {
Single1 s11 = Single1.getInstance();
Single1 s12 = Single1.getInstance();
System.out.println(s11.equals(s12));
Single2 s21 = Single2.getInstance();
Single2 s22 = Single2.getInstance();
System.out.println(s21.equals(s22));
}
}
测试结果
true
true
说明两种方式实现的都是单例模式。
因为懒汉式自身的问题,所以在写程序的时候一般使用饿汉式。