A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭晓晨 中级黑马   /  2013-12-18 17:21  /  1308 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭晓晨 于 2013-12-19 12:46 编辑
  1. class Single
  2. {
  3.         private static Single s = new Single();
  4.         private Single(){}

  5.         public static Single getInstance()
  6.         {
  7.                 return s;
  8.         }
  9. }

  10. class  SingleInstanceDemo
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                 Single s1 = Single.getInstance();
  15.                 Single s2 = Single.getInstance();
  16.         }
  17. }
复制代码


关于单例设计模式这一段代码有个问题想请教大家
执行主函数Single s2 = Single.getInstance();这一句的时候Single还会被加载一次吗?private static Single s = new Single(); 这句还会再执行一次吗?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
不会了  直接返回那个静态的对象
回复 使用道具 举报
本帖最后由 smileven 于 2013-12-18 17:52 编辑

你这样写可以完成单例设计模式的效果的!!!
单例模式是在某一时刻在内存中只能存在一个此类对象。
也就是说当新建了一个单例对象之后,就不能再新建此类对象。
所以正确的单例模式Single s2 = Single.getInstance()这一句肯定是不会执行的。但是这样s1和s2指向同一个引用,操作的时候会相互影响。


下面是我写的单例设计模式:
class single
{
        private static single s = null  ;
        private single(){}
        Object obj = new Object();
        public static single getInstance()
        {
                if(s == null){
                        synchronized(single.class)
                        {
                                if(s == null)
                                        s = new single();
                        }
                }
                return s ;
        }
}
代码分析:
此类中已经声明了本类对象s,并且s=null。
所以在外界在调用getInstance()新建对象的时候,如果判断s==null,那么就可以建立新的对象,并传引用给s。
否则s!=null,说明s的引用不为空,也就是内存中已经存在single对象,所以就不能新建对象了。

如果是多线程操作的话:
当一个线程进入if(s==null){}语句块,通过了判断立刻进入了等待状态,s没有被赋值,还是为null。
而其他线程又在此时进入if语句块,此时的s==null。所以该线程可以建立single对象并传引用给s。
当等待中的线程回复运行状态后,已经判断s==null,所以会直接新建single对象并传引用给s。
但是这样就把后进入线程新建的single对象的值给覆盖掉了。
所以要在要在if(s==null)代码块中加同步代码块synchronized(single.class)。





回复 使用道具 举报
谢谢!学写了!
回复 使用道具 举报
smileven 发表于 2013-12-18 17:49
你这样写可以完成单例设计模式的效果的!!!
单例模式是在某一时刻在内存中只能存在一个此类对象。
也就是 ...

弱弱的问一句:  Object obj = new Object();这段代码是不是多余的啊?
回复 使用道具 举报
静态资源,不会再重复执行了那句,应为是静态的,所以是公用的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马