单例模式主要包含以下几种,并且每种的优缺点如下:
1.饿汉模式
public class SingleObject {
private final static SingleObject INSTANCE = new SingleObject();
private SingleObject(){
}
public static SingleObject getInstance() {
return INSTANCE;
}
}
优点:实现简单
缺点:需要预先创建,不管是否需要
2.懒汉模式
public class SingleObject {
private static SingleObject instance = null;
private SingleObject(){
}
public static SingleObject getInstance() {
if (instance == null) {
instance = new SingleObject();
}
return instance;
}
}
优点:不需要时不会加载创建
缺点:非线程安全并且获取实例慢
3.线程安全懒汉模式
public class SingleObject {
private static SingleObject instance = null;
private SingleObject(){
}
public synchronized static SingleObject getInstance() {
if (instance == null) {
instance = new SingleObject();
}
return instance;
}
}
优点:线程安全
缺点:加了同步锁,并发量大时获取实例速度大大降低
4.双重校验锁
public class SingleObject {
private volatile static SingleObject instance = null;
private SingleObject(){
}
public static SingleObject getInstance() {
if (instance == null) {
synchronized (SingleObject.class){
if (instance == null) {
instance = new SingleObject();
}
}
}
return instance;
}
}
优点:线程安全+懒加载
缺点:实现复杂
5.静态内部类
public class SingleObject {
private static class SingletonHolder{
private final static SingleObject INSTANCE = new SingleObject();
}
private SingleObject(){
}
public static SingleObject getInstance() {
return SingletonHolder.INSTANCE;
}
}
优点:懒加载SingletonHolder类
缺点:实现复杂,需要多创建内部类
6.枚举
public enum SingleObject {
INSTANCE;
private SingleObject(){
}
public static SingleObject getInstance() {
return INSTANCE;
}
}
完整方式:
public class SingleObject {
private SingleObject(){
}
private enum SingletonEnum{
INSTANCE;
private SingleObject instance = null;
private SingletonEnum(){
instance = new SingleObject();
}
private SingleObject getInstance(){
return instance;
}
}
public static SingleObject getInstance() {
return SingletonEnum.INSTANCE.getInstance();
}
}
优点:线程安全,《effective java》推荐使用
缺点:实现较为繁琐
网友评论