0
点赞
收藏
分享

微信扫一扫

Java设计模式 ->单例模式



在整个程序中 确保任何情况下绝对只有一个 实例 ,并提供一个全局访问点
例如: Tomcat包中的 ServletContext ServletConfig JDK中的 Runtime


单例优缺点


优点:
1、设置全局访问点,严格控制访问权限
2、避免频繁的创建销毁对象,避免多重开销
3、在一个应用内存中只有一个实例,减少内存的开销 
缺点:
1、修改困难,每次修改需要修改源码


单例模式类型


饿汉式单例:在类加载的时候进行初始化,并且创建单例对象。 ​

​优点:线程安全,适合于单例对象个数比较少的情况下。​

​缺点:如果对象比较多,不建议使用饿汉式单例,可能初始化很多单例对象导致内存浪费,实际可能不用。 ​

​​汉式单例:和饿汉式单例向对应,懒汉式单例实在使用的时候去初始化对象。 ​

​优点:节省内存开销。 ​

​缺点:线程不安全[双重检查锁机制,volatile指令重排序问题]。 ​

注册式单例:

枚举式单例:通过Java关键字 enum 来创建一个单例对象[饿汉式单例模式的实现,也就不适合大量对象的创建],JDK底层实现enum不能进行反射。 ​

容器是单例:通过Map来管理对象,用的时候再去创建,非线程安全的。 ​

ThreadLocal:线程内部单例 ThreadLocalMap ​


单例如何被破坏的


1、通过反射调用 newInstance()方法破坏单例[ 在类构造方法增加判断是否是单例 ] ​

2、序列化破坏单例,将对象序列化写入磁盘,在从磁盘读取对象进行反序列化,会重新分配内存对象,也就是重新创建一个对象,也就和之前对象不一致。​


举报

相关推荐

0 条评论