1、饿汉式(线程安全,调用效率高,但是不能延时加载):
public class SingletonDemo {
private static SingletomDemo instance = new SingletonDemo();
private SingletonDemo() {}
private static SingletonDemo getInstance() {
return instance;
}
}
初始化的时候已经通过new方法创建了对象,这个实现方法的问题是单例还没有需要使用,就已经初始化完成了,造成资源浪费。
2.懒汉式(线程安全,调用效率不高,但是能延时加载):
public class SingletonDemo2 {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonDemo2 instance;
//构造器私有化
private SingletonDemo2(){}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance=new SingletonDemo2();
}
return instance;
}
}
3.Double CheckLock实现单例:DCL也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用):
public class SingletonDemo3 {
private volatile static SingletonDemo5 SingletonDemo5;
private SingletonDemo3() {
}
public static SingletonDemo3 newInstance() {
if (SingletonDemo3 == null) {
synchronized (SingletonDemo3.class) {
if (SingletonDemo3 == null) {
SingletonDemo3 = new SingletonDemo3();
}
}
}
return SingletonDemo3;
}
}
4.静态内部类实现模式(线程安全,调用效率高,可以延时加载)
public class SingleTemplate4 {
public static class SingleTemplateInstance {
private static final SingleTemplate4 instance = new SingleTemplate4();
}
private SingleTemplate4() {}
private static SingleTemplate4 getInstance() {
return SingleTemplateInstance.instance;
}
}
5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)
public enum SingletonDemo4 {
//枚举元素本身就是单例
INSTANCE;
//添加自己需要的操作
public void singletonOperation(){
}
}
如何选用:
-单例对象 占用资源少,不需要延时加载,枚举 好于 饿汉
-单例对象 占用资源多,需要延时加载,静态内部类 好于 懒汉式