单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
1、懒汉式单例
懒汉式单例,在类第一次调用的时候实例化自己。
①、线程不安全单例
public class SingleUtil {
private static SingleUtil single = null;
private SingleUtil() {
}
public static SingleUtil getSingle() {
if (single == null) {
single = new SingleUtil();
}
return single;
}
}
②、线程安全单例
public class SingleUtil {
private static SingleUtil single = null;
private SingleUtil() {
}
public static synchronized SingleUtil getSingle() {
if (single == null) {
single = new SingleUtil();
}
return single;
}
}
③、双重检查锁定单例
public class SingleUtil {
private static SingleUtil single = null;
private SingleUtil() {
}
public static SingleUtil getSingle() {
if (single == null) {
synchronized (SingleUtil.class) {
if (single == null) {
single = new SingleUtil();
}
}
}
return single;
}
}
④、静态内部类单例
public class SingleUtil {
private static class SingleHolder {
private static final SingleUtil singleUtil = new SingleUtil();
}
private SingleUtil() {}
public static SingleUtil getInstance() {
return SingleHolder.singleUtil;
}
}
2、饿汉式单例
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
public class SingleUtil {
private SingleUtil() {}
private static final SingleUtil singleUtil = new SingleUtil();
public static SingleUtil getInstance() {
return singleUtil;
}
}