单例模式:最简单的一种设计模式
单例模式,确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例
java中有两种单例模式:饿汉式(加载时候就会实例化) 懒汉式(第一次引用时候才进行实例化)
饿汉式:
在类被加载时候 ,静态变量singLeton会被初始化,调用私有的构造器创建唯一的singLeton实例,提供一个私有的构造方法,以及提供一个公共的返回实例的引用
public class SingLeton {
public int count = 0;
static SingLeton singLeton = new SingLeton();
private SingLeton() {
}
public static SingLeton getInsance() {
return singLeton;
}
}
饿汉式: 返回实例的方法需要同步synchroized 否则 多线程状态下 会出现多个实例
public class SingLetonLh {
private SingLetonLh() {
}
private static SingLetonLh singLeton = null;
public static synchronized SingLetonLh getInternec() {
if(singLeton == null) {
singLeton = new SingLetonLh();
}
return singLeton;
}
}
饿汉式与懒汉式的区别
1、饿汉式单例实例 被加载时候就会创建,懒汉式则是第一次调用的时候才会初始化
2、从资源利用效率上说 懒汉式要差一些,但是从反应速度上和反应时间上讲,饿汉式要比懒汉式稍好些
3、饿汉式 更符合java语言特点
多线程的优化:如果使用synchronized 加在懒汉式的方法上,如果频繁的调用 会很耗费资源,可以加在方法内 ,判断为单利对象为空后加一个锁,锁方法内再一次判断是否为空 这样就节约了资源提高了效率
单例模式的应用:
单例模式的优点:减少内存开支,特别是对一个对象需要频繁的创建,销毁,减少了性能开销,当一个对象的产生需要比较多资源,如读取配置文件信息等 可以在启用时 直接产生一个对象,然后永久驻留内存的方式来解决
单例模式的缺点:无法创建子类,对测试不利,与单一职责原则冲突
单例模式的使用场景:
一个系统中如果要求一个类有且仅有一个实例,当出现多个实例的时候就会哦造成不良反应的时候 就考虑使用单例模式
要求生成唯一序列号的环境
在整个项目中需要一个共享访问或者共享数据
创建一个对象需要小号过多的资源 如访问io和数据库等资源
需要定义大量的静态常亮,和静态方法的环境,可以采用单例模式
使用单例的注意事项:
当系统为多jvm分布式 或者一个jvm有多个类加载器 应避免使用有状态单例(当做状态库使用)
如果一个类实现了cloneAble serializable接口 则有可能反序列化或克隆出一个新的实例类 因此单例不需要实现cloneAble serializable接口