网站首页 > java教程 正文
单例是应用开发中一种设计模式,主要应用场景为:当且仅当系统中只能保留一个对象时使用。本文提出4中可以在生产环境中使用的单例设计模式。推荐使用enum的方式。
应用场景
例如一下应用场景
1、 Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?
2、网站的浏览人数统计,一般也是采用单例模式实现,否则难以同步。
3、应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
4、在joshua block 的《effective java second edition》 一书中给出了三种单例设计模式
1、采用静态变量:
这种写法使用了私有的构造方法。来保证只能有一个实例,但是这种并不安全,因为,你可以通过反射来调用私有构造方法。这个时候你可以抛出异常。以下代码仅作为参考。
2、采用静态方法
3、采用enum的方式
这种模式是目前最佳的,因为:
1、JVM会保证enum不能被反射并且构造器方法只执行一次。
2、此方法无偿提供了序列化机制,绝对防止反序列化时多次实例化。
3、运行时(compile-time )创建对象(懒加载) // todo 关于cmpile-time和run-time有时间我单独写一篇文章。
enum是jdk5的特性,现在(2017)web应用普遍在jdk6、7、8,所以可以放心使用。
目前最佳的方式是使用接口的方式(解耦):
或者不使用接口的形式
也有人用其他的方式,我对这种方法持强烈反对,具体可以参考文献4,以下代码仅做参考
在其他文章中有提到“懒汉”、“恶汉”的名词,其实懒汉主要就是"懒"加载[注:指在使用时装载,不使用时不进行装载]
有人提出这种懒汉设计
很显然这种设计线程不安全,一般不会使用。
有人又提出了懒汉改进的方法,使其线程安全。
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,因为是重量级锁,效率很低。
于是有人提出了双重校验锁机制,这个用的也比较多。
下面代码就是用double checked locking 方法实现的单例,这里的getInstance()方法要检查两次,确保是否实例INSTANCE是否为null或者已经实例化了,这也是为什么叫double checked locking 模式。
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群346942462,我们一起学Java!
- 上一篇: 从简到难,一步步演进单例模式的五种写法
- 下一篇: [ Java ] 单例模式 的八种实现方式
猜你喜欢
- 2024-09-22 带你了解单例模式(Singleton Pattern)的五种写法!
- 2024-09-22 单例模式的常用写法(单例模式三种写法)
- 2024-09-22 GoF之单例模式详解(单例模式在哪里使用)
- 2024-09-22 设计模式之-单例模式(单例设计模式的作用)
- 2024-09-22 Java(面试)——单例模式(java中单例模式的实现)
- 2024-09-22 在Java中实现单例模式(java单例模式实现方式)
- 2024-09-22 Java单例模式(java单例模式双重检查)
- 2024-09-22 Java设计模式之单例模式解析(java 单例模式 例子)
- 2024-09-22 本文将给大家介绍java中设计模式——单例模式
- 2024-09-22 java面试:单例模式,一篇就够了(java单例模式写法)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)