1、静态常量(饿汉式)
public class Singleton1 {
private static final Singleton1 SINGLETON = new Singleton1();
/**
* 私有化构造方法
*/
private Singleton1() {}
/**
* 提供公共方法,获取对象
* @return
*/
public static Singleton1 getInstance() {
return SINGLETON;
}
}
优点:写法简单,在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到延迟加载的效果。如果一直未使用过这个实例,则会造成内存浪费。
2、线程安全,同步方法(懒汉式)
public class Singleton2 {
static Singleton2 singleton2;
/**
* 私有化构造方法
*/
private Singleton2() {}
/**
* 提供一个方法,返回实例
* @return
*/
public synchronized static Singleton2 getInstance() {
if(null == singleton2) singleton2 =new Singleton2();
return singleton2;
}
}
缺点:效率太低
3、双重检查
public class Singleton3 {
static Singleton3 singleton3;
/**
* 私有化构造方法
*/
private Singleton3() {}
/**
* 提供一个方法,返回实例
* 最小化加锁
* @return
*/
public static Singleton3 getInstance() {
if(null == singleton3) {
synchronized(Singleton3.class) {
if(null == singleton3) singleton3 =new Singleton3();
}
}
return singleton3;
}
}
优点:线程安全;延迟加载;效率较高。
4、静态内部类
public class Singleton4 {
private static class SingletonHolder{
private static Singleton4 singleton4 = new Singleton4();
}
/**
* 私有化构造方法
*/
private Singleton4() {}
public static Singleton4 getInstance() {
return SingletonHolder.singleton4;
}
}
优点:避免了线程不安全,延迟加载,效率高。