在创建单例模式的时候,如果单纯的只考虑单例而不思考那样做的话会产生什么问题这样是不严谨的,比如会发生线程安全问题,看了一些文章其中一篇写得非常详细有关单例模式的问题和性能比较,这篇文章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 }
---------------------
作者:坑里水库
来源:CSDN
原文:https://blog.csdn.net/qq_27409289/article/details/51838332
版权声明:本文为博主原创文章,转载请附上博文链接!