单例模式核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
单例模式的优点:由于单例模式只生成一个实例,减小了系统的开销,当一个对象的产生需要比较多的资源时,如读取配置产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
主要的单例模式有饿汉式、懒汉式、静态内部类式单例模式。
其中饿汉式模式代码为:
package com.饿汉式模式;
/*
* 特点:线程安全,调用效率高,但不能延迟加载
* 优点:饿汉式单例模式代码中,static变量会在类装载时初始化,
* 此时也不会涉及到多个线程对象同时访问该对象的问题,
* 虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题,
* 因此可以省略synchrnized关键字
* 缺点:如果只是加载本类,而没有使用getInstance方法获取该类的对象
* 甚至永远没有使用到该类的话,则会造成资源的浪费
*
*/
public class SingletonDemo {
private static SingletonDemo intance = new SingletonDemo();
//私有的构造方法
private SingletonDemo(){
}
//可以省略synchronized
//因为方法没有同步,所以调用效率高
public static /*synchronized*/ SingletonDemo getIntence(){
return intance;
}
}
懒汉模式为:
package com.懒汉式模式;
/*
*特点:线程安全,执行效率不高,但可以实现延迟加载
*资源利用率高,但getIntance方法并发效率低
*
*/
public class SingletonDemo {
//初始化时并没有急于直接创建对象,而是在真正用到的时候才去加载
private static SingletonDemo intance;
private SingletonDemo(){
//加这个if语句的作用就是避免反射漏洞
if(intance!=null)
throw new RuntimeException();
}
//为了保证线程安全,要在getIntance方法前加上synchronized修饰,实现线程同步
//因为加上了synchronized同步,所以执行效率低
public static synchronized SingletonDemo getIntance(){
if(intance==null){
intance = new SingletonDemo();
}
return intance;
}
}
静态内部类模式为:
package com.静态内部类式模式;
/*
* 特点:外部类没有static属性,不会像饿汉式模式一样类加载时就初始化对象
* 只有真正调用getIntance方法时才会加载静态内部类
* 加载类是线程安全的
* ntance是 static final的,保证了内存中只有这样一个实例,而且只能被赋值一次。
* 所以是线程安全的
* 兼并了并发高效调用和延迟加载的优势
*/
public class SingletonDemo {
//在初始化SingletonDemo类的时候并不会初始化他的静态内部类
private static class SingletonInance{
private static final SingletonDemo intance = new SingletonDemo();
}
public static SingletonDemo getIntance(){
//只有调用该方法时才会加载静态内部类
return SingletonInance.intance;
}
private SingletonDemo(){
}
}