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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Changer_s 于 2013-5-28 19:38 编辑

我记得我们老师以前写代码最喜欢这样写,表示很不理解
        private static Single instance = null;   
        public static Single getInstance(){
                if(instance == null){                  
                        instance = new Single();                                                               
                }
                return instance;
        }
我以前总是这样写:然后因为老师写的代码好屌一样,我就向他学习了,但是看视频对他们的评价又不是我想的那样
private Single();
        private static final Single instance = new Single();  
        public static Single getInstance(){
                return instance;
        }

此刻的我迷茫了,大家说说你们对这两个方式的理解吧!!!

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
袁梦希 + 1 + 3 很给力!

查看全部评分

11 个回复

倒序浏览
视频中,毕老师不是说过懒汉式有可能出安全问题,所以才建议用饿汉式么....................................
回复 使用道具 举报
单例模式在毕老师的视频中有讲到,可以再仔细看看。
饿汉式是在单例类的实例在JVM启动时就创建好了,懒汉式则是在第一次访问单例类的实例时才去创建,
即可以把饿汉式看成是预加载,懒汉式则为延迟加载;
  1. //饿汉式
  2. class Single
  3. {
  4.   private static final Single s = new Single();
  5.   private Single(){}
  6.   public static Single getInstance()
  7.   {
  8.     return s;
  9.   }
  10. }
复制代码
饿汉式的单例类实例由于是在JVM启动时创建的,所以不用考虑多线程问题,懒汉式则需要进行同步(synchronized)
  1. //懒汉式
  2. class Single{       
  3.                 private static Single s = null;
  4.                 private Single(){}
  5.                 public static synchronized Single getInstance(){ //用同步函数的方式确保安全性,但效率较低。
  6.                         if(s==null){
  7.                                 //  --->A
  8.                                 //  --->B
  9.                                 s = new Single();
  10.                         }
  11.                         return s;
  12.                 }
  13.         }
复制代码
可以通过双重判断来提高效率
  1. class Single{        //懒汉式
  2.                 private static Single s = null;
  3.                 private Single(){}
  4.                 public static Single getInstance(){
  5.                         if(s==null){        //判断对象是否已经被创建,若已创建则不需进入同步代码块,提高效率。
  6.                                 synchronized(Single.class){        //使用同步代码块的方式实现同步
  7.                                         if(s==null){
  8.                                                 s = new Single();
  9.                                         }
  10.                                 }
  11.                         }
  12.                         return s;
  13.                 }
  14.         }
复制代码

评分

参与人数 2技术分 +2 黑马币 +3 收起 理由
袁梦希 + 2 + 2 很给力!
Changer_s + 1 说的不错,挺好的

查看全部评分

回复 使用道具 举报
单例设计思想:
为了其他程序过多建立该类对象,禁止其他程序建立该类对象---》将构造函数私有化。
为了让其他程序能访问到该类对象,在本类中定义一个对象---》在类中创建一个本类对象。
为了方便其他程序对自定义兑现的访问,可以对外提供一些访问方式---》提供一个方法可以获取该对象。
懒汉式有几点要注意:
  1. class Single02{
  2.         private Single02(){}
  3.         private static Single02 instance = null;
  4.         public static Single02 getInstance(){
  5.                 if(instance==null){//双重否定加同步,双重否定是用来提高效率、同步是保证安全
  6.                         synchronized(Single02.class){//同步代码块需要对象(锁),此锁为该类所属的字节码文件
  7.                                 if(instance==null){
  8.                                         instance = new Single02();       
  9.                                 }
  10.                         }
  11.                 }
  12.                 return instance;       
  13.         }
  14. }
复制代码

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
袁梦希 + 1 很给力!
Changer_s + 1 解释很到位

查看全部评分

回复 使用道具 举报
神之梦 发表于 2013-5-28 01:05
视频中,毕老师不是说过懒汉式有可能出安全问题,所以才建议用饿汉式么.................................. ...

以前教我的老师没有讲过多线程,他做的时候就像懒汉式
我一直都以为他这样做很牛逼,看了毕老师,我就笑了
如果是单线程,也就是说不考虑线程问题,他那种又有什么优势呢?
回复 使用道具 举报
funneies 发表于 2013-5-28 02:01
单例模式在毕老师的视频中有讲到,可以再仔细看看。
饿汉式是在单例类的实例在JVM启动时就创建好了,懒汉式 ...

恩恩,说的挺好的!换一个说话,如果不考虑线程问题
懒汉式的优势又在哪里呢?
难道是因为它仅仅是在需要的时候才创建,节约资源吗?
回复 使用道具 举报
卢祥洲 发表于 2013-5-28 07:38
单例设计思想:
为了其他程序过多建立该类对象,禁止其他程序建立该类对象---》将构造函数私有化。
为了让 ...

解释了详细,很好!!!嘿嘿。。。
以前在没学线程的时候
老师经常用懒汉式,那这又是这是为什么呀?
回复 使用道具 举报
Changer_s 发表于 2013-5-28 08:42
解释了详细,很好!!!嘿嘿。。。
以前在没学线程的时候
老师经常用懒汉式,那这又是这是为什么呀? ...

个人习惯吧,个人认为
回复 使用道具 举报
卢祥洲 发表于 2013-5-28 09:00
个人习惯吧,个人认为

呵呵,有可能
我再等等其他的答案,谢谢啦
回复 使用道具 举报
Changer_s 发表于 2013-5-28 08:42
解释了详细,很好!!!嘿嘿。。。
以前在没学线程的时候
老师经常用懒汉式,那这又是这是为什么呀? ...

那是因为面试都面的是懒汉式,可以考察一个程序员的很多知识点。。。
回复 使用道具 举报
神之梦 发表于 2013-5-28 01:05
视频中,毕老师不是说过懒汉式有可能出安全问题,所以才建议用饿汉式么.................................. ...

恩恩,很对,但是这是对于多线程来说
如果是单线程呢?为什么还是有很多人喜欢懒汉式写法?
回复 使用道具 举报
Changer_s 发表于 2013-5-28 19:23
恩恩,很对,但是这是对于多线程来说
如果是单线程呢?为什么还是有很多人喜欢懒汉式写法? ...

好吧,我只是来学习的:L
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马