单例模式
私有的类构造器
持有自己类型的属性
对外提供获取实例的静态方法
1、懒汉模式
线程不安全,延迟初始化
public class SingletonDemo {
private static SingletonDemo singletonDemo;
private SingletonDemo(){}
public static SingletonDemo getInstence(){
if(singletonDemo == null){
singletonDemo = new SingletonDemo();
}
return singletonDemo;
}
}
2、饿汉模式
线程安全,容易产生垃圾,一开始就初始化
public class SingletonDemo {
private static SingletonDemosingletonDemo =new SingletonDemo();
private SingletonDemo(){};
public static SingletonDemo getInstence(){
return singletonDemo;
}
}
3、双重锁模式
线程安全,延迟初始化,安全在多线程情况下保持高性能,双重锁模式,进行了两次判断,第一次是为了避免不要的实例,第二次是进行同步,避免多线程问题。
public class SingletonDemo {
private static SingletonDemo singletonDemo;
private SingletonDemo(){}
public static SingletonDemo getInstence(){
if(singletonDemo == null){
synchronized (SingletonDemo.class){
if (singletonDemo == null){
singletonDemo = new SingletonDemo();
}
}
}
return singletonDemo;
}
}
4、静态内部类单例模式
只有第一次调用getInstence()方法时,虚拟机才会加载Inner,并初始化singletonDemo,
只有一个线程可以获得对象的初始化锁,其它线程无法进行初始化,保证对象的唯一性,
public class SingletonDemo {
private SingletonDemo(){};
public static SingletonDemo getInstence(){
return Inner.singletonDemo;
}
private static class Inner{
private static SingletonDemosingletonDemo =new SingletonDemo();
}
}
5、枚举单例模式
默认枚举实例的创建是线程安全的,并且在任何情况下都是单例。
枚举类隐藏了私有的构造器
枚举类的域 是相应类型的一个实例对象
public enum SingletonDemo{
INSTENCE;
public static SingletonDemo getInstence(){
return SingletonDemo.INSTENCE;
}
}
网友评论