Java设计模式---单例模式
2018-11-27 08:31:32来源:博客园 阅读 ()
参考于 :
大话设计模式
java三百集---高淇
讲在开头:如果需要懒加载,推荐使用静态内部类实现
如果不需要懒加载,推荐使用枚举
1.单例模式的概念
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
你可能会想,我在创建对象的时候,先判断是不是null,不是null就直接获得,是null就创建实例。
“生孩子还是不生孩子”应该是夫妻的责任,而不是我的责任。如果按照上面的想法,那么我就需要先判断一下才可以,这样“能不能生”就成了我的责任了哦。
我们把“生一个孩子”的责任交给类,我们只需要去获得就完事了。
2.第一种实现---饿汉式
JVM加载类的时候先实例化了
优点:JVM加载类是线程安全
缺点:不能懒加载
package com.dingyu; /** * 饿汉式单例模式 ,效率高 * 线程安全,不需要synchronized关键字,但是不能懒加载 * @author dingyu * */ public class Singleton01 { private static Singleton01 instance = new Singleton01(); private Singleton01() { } public static Singleton01 getSingleton() { return instance; } }
3.第二种实现---懒汉式
调用方法的时候再去创建实例
优点:懒加载
缺点:需要同步(不同步,如果线程a,线程b同时调用getSingleton(),相当于new了两次),效率不高
package com.dingyu; /** * 懒汉式单例模式 * 优点:懒加载 * 缺点:需要同步 * @author dingyu * */ public class Singleton02 { private static Singleton02 instance = null; private Singleton02() { } private static synchronized Singleton02 getSingleton() { if (instance == null) instance = new Singleton02(); return instance; } }
4.第三种实现---双重锁定(尽量别用)
如果第一次获得就加锁,创建。其他的时候就直接返回就可以。
优点:效率高,可以懒加载
缺点: JVM内部的原因会出现不可预知的错误(本人还没去了解原因,如果有知道的可以告诉我下,感谢)
为什么要判断两次null,大话设计模式中解释了:如果线程a,线程b,通过突破了第一层null,线程a获得锁,线程b等着。a创建了个实例,释放锁,b获得锁,继续运行,如果没有第二层null,那么b仍然会创建一个实例,破坏单例模式。
package com.dingyu; /** * 双重检测锁实现单例模式 * * @author dingyu * */ public class Singleton03 { private static Singleton03 instance = null; private Singleton03() { } public static Singleton03 getSingleton() { if (instance == null) { synchronized (Singleton03.class) { if (instance == null) { instance = new Singleton03(); } } } return instance; } }
5.第四种实现---静态内部类(推荐)
静态内部类是你用到他的时候,他才会加载,而且加载类的时候是线程安全的,不需要同步
优点:懒加载,效率高
package com.dingyu; /** * 静态内部类实现单例模式 * @author dingyu * */ public class Singleton04 { private Singleton04() { } private static class SingletonInnerClass { private static Singleton04 instance = new Singleton04(); } public static Singleton04 getSingleton() { return SingletonInnerClass.instance; } }
6.第五种实现---枚举(推荐)
枚举很特殊,JVM帮我们实现的单例,天然是单例的
优点:效率高,反射破解不了
缺点:不能懒加载
package com.dingyu; /** * 枚举实现单例 枚举本来就是单例的 * * @author dingyu * */ public enum Singleton05 { INSTANCE; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:JavaSSM框架整合
下一篇:JAVA poi 合并单元格
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash