单例模式中采用的延迟加载创建单例(内部类)
2016-07-06 13:58
288 查看
此篇文章为看别人的文章自己小小记录的一点日常知识。
在创建单例模式的时候,如果单纯的只考虑单例而不思考那样做的话会产生什么问题这样是不严谨的,比如会发生线程安全问题,看了一些文章其中一篇写得非常详细有关单例模式的问题和性能比较,这篇文章http://blog.sina.com.cn/s/blog_62c7c3030100zwkp.html(谢谢大神)。其中在文章中提出JVM的无序写也会使得单例模式的失败,现在就JVM的无序写这一点简单的笔记。比如: Single sin = new Single(); 一共进行了如下的步骤:
1,new 在内存区开辟了一个内存空间
2,Single() 通过构造函数进行初始化
3,single = new Single() 对single进行赋值 其中赋值可以理解为包含两步 其中一步为new 赋值给single 第二部则是把初始化的结果赋值给它
这种原因就是因为jvm的无序写
JVM的无序写也会使得单例模式失效,所以单例模式比较好的方式便是通过匿名类来进行创建,匿名类采用的是延迟加载会只有用到的时候才会装载进内存所以不用担心对象创建了后没有使用一直占用内存的情况(第一种方法),也不会产生线程安全的问题,下面第二种方法就是一开始就通过 static 的特殊性创建单例
方法二:预先初始化static变量。
在创建单例模式的时候,如果单纯的只考虑单例而不思考那样做的话会产生什么问题这样是不严谨的,比如会发生线程安全问题,看了一些文章其中一篇写得非常详细有关单例模式的问题和性能比较,这篇文章http://blog.sina.com.cn/s/blog_62c7c3030100zwkp.html(谢谢大神)。其中在文章中提出JVM的无序写也会使得单例模式的失败,现在就JVM的无序写这一点简单的笔记。比如: Single sin = new Single(); 一共进行了如下的步骤:
1,new 在内存区开辟了一个内存空间
2,Single() 通过构造函数进行初始化
3,single = new Single() 对single进行赋值 其中赋值可以理解为包含两步 其中一步为new 赋值给single 第二部则是把初始化的结果赋值给它
这种原因就是因为jvm的无序写
JVM的无序写也会使得单例模式失效,所以单例模式比较好的方式便是通过匿名类来进行创建,匿名类采用的是延迟加载会只有用到的时候才会装载进内存所以不用担心对象创建了后没有使用一直占用内存的情况(第一种方法),也不会产生线程安全的问题,下面第二种方法就是一开始就通过 static 的特殊性创建单例
方法一: 12 public class SingletonFive { 17 private static class SingletonHolder{ 19 private static SingletonFive instance = new SingletonFive(); 20 } 25 private SingletonFive() { 27 } 34 public static SingletonFive getInstance() { 35 return SingletonHolder.instance; 36 } 38 }
方法二:预先初始化static变量。
1 11 public class SingletonFour { 14 private static SingletonFour instance = new SingletonFour(); 19 private SingletonFour() { 21 } 28 public static SingletonFour getInstance() { 29 return instance; 30 } 32 }
相关文章推荐
- 配置action时多条件拼接
- Linux驱动开发学习的一些必要步骤
- Android View坐标
- HDU 3410 Passing the Message (单调栈)
- rpm转换成deb
- zabbix存储oracle
- Centos7 下Boost 1.61.0源码 配置开发环境
- Eclipse 添加 CVS
- 入职第一天的一些准备
- php mongodb操作类,适合mongodb2.x和mongodb3.x
- 虚拟机ubuntu下安装apache、svn及svn图形管理
- Spring@Autowired注解与自动装配
- 【 马哥教育内部文档】-RPM制作指南
- cobbler部署机器的默认密码
- pojlainxi
- 详解rsyslog/Python/LogAnalyzer 记录和查看服务端/客户端日志
- 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档
- TC的handler类调用swt窗口
- linux系统redis服务配置
- Codeforces Round #358D. Alyona and Strings【DP】