单例模式:
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
单例模式的应用场景:比如windows中的任务管理器、回收站,网站的计数器其他的比如数据据库的连接池,操作系统的文件系统,Servlet编程中的Applicants对象也是,每个Servlet对象也是单例,Spring MVC框架中的控制器对象也是单例。
单例模式优点:
由于单例模式只生成一个实例 ,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、于生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决
单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理
常见的五种单例模式实现方式:
-主要:
●饿汉式(线程安全,调用效率高。 但是,不能延时加载。 )
●懒汉式(线程安全,调用效率不高。但是,可以廷时加载。 )
-其他:
●双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
●静态内部类式(线程安全,调用效率高。但是,可以延时加载)
●枚举单例(线程安全,调用效率高,不能延时加载)
饿汉式:
(1)私有化构造器
(2)提供一个属性变量(private static)
(3)提供一个public方法
/**
* 饿汉式单例模式
* 优点:线程安全,方法没有同步,调用效率高
* @author 佳哥
*
*/
public class SingletonDemo01 {
//(1)私有化构造器(private)
private SingletonDemo01(){
}
//(2)提供一个属性变量(private static)实例SD(由于饿汉式非常饥渴,类初始化后立即加载对象(本来就线程安全))
private static SingletonDemo01 SD = new SingletonDemo01();
//(3)提供一个public static方法
public static SingletonDemo01 getSD() {
return SD;
}
}
懒汉式实现(单例对象延迟加载):
创建实例的时候没有立刻new对象,延迟加载用的时候new,还有在public方法中使用同步块:sychronized,避免高并发的时候创建多个对象
/**
* 懒汉式单例模式
* 优点:线程安全,方法同步,资源利用率高
* 缺点:调用效率低
* @author 佳哥
*
*/
public class SingletonDemo02 {
//(1)私有化构造器(private)
private SingletonDemo02(){
}
//(2)提供一个属性变量(private static)实例SD(由于饿汉式非常饥渴,类初始化后立即加载对象(本来就线程安全))
private static SingletonDemo02 SD = new SingletonDemo02();
//(3)提供一个public static方法
public static synchronized SingletonDemo02 getSD() {
if(SD == null) {
SD = new SingletonDemo02();
}
return SD;
}
}
双重检测查锁:不建议使用,在懒汉式中的if语句中加锁,(了解)
静态内部类式(懒加载):
并发高校调用和延迟加载
线程安全,并不会立刻初始化内部类,而是真正调getSD方法的时候才会执行InnerClassNewSD.SD的时候才会初始化内部类
/**
* 静态内部类实现单例模式
* @author 方楚佳
*
*/
public class SingletonDemo03 {
//(1)私有化构造器(private)
private SingletonDemo03(){
}
//(2)静态内部类(创建对象)
private static class InnerClassNewSD{
private static final SingletonDemo03 SD = new SingletonDemo03();
}
(3)提供一个public static方法返回实例
public static SingletonDemo03 getSD() {
//内部类调SD
return InnerClassNewSD.SD;
}
}
枚举实现单例:
/**
* 枚举避免反射和反序列化创建 对象的漏洞
* 没有懒加载
* @author 佳哥
*
*/
public enum SingletonDemo04 {
//枚举元素本身单例
INSTANT;
//实现自己的操作
public void MakeYourself() {
}
}