黑马程序员技术交流社区

标题: 单例模式 [打印本页]

作者: 游呤人    时间: 2015-7-19 01:21
标题: 单例模式
本帖最后由 游呤人 于 2015-7-19 23:31 编辑

public class Single{
private static final Single single;
   private Single(){}
   public static Single getSingle(){
        if(single==null){
               synchronized(Single.class){
                        if(single==null){
                               single=new Single();              
                        }
                }
        }
        return single;
    }      
}
  1. public class Single {
  2.         private Single(){}
  3.         private static final Single single =new Single();
  4.         public static Single getSingle(){
  5.                 return single;
  6.         }
  7.         
  8.         //下面功能的代码
  9. }         //饿汉式 构造器私有化,定义本类私有成员常量并实例化,定义静态提供函数
复制代码

感谢:joe520kay wing-SF 李林_三位的回复
作者: eayonh    时间: 2015-7-19 02:49

作者: mortonnnn    时间: 2015-7-19 07:15
挺好的哈哈。
作者: fantianfei    时间: 2015-7-19 08:48
温习了一半
作者: joe520kay    时间: 2015-7-19 10:00
补充说明:懒汉式与饿汉式的区别在于:懒汉式是在调用时才产生实例化对象。
作者: wing-SF    时间: 2015-7-19 10:35
本帖最后由 wing-SF 于 2015-7-19 10:36 编辑

哥们在懒汉式中,你如果这么写,还有有一点点小问题的,可以使用双重判断提高效率如下:public class Single(){
   private static final Single single;
   private Single(){}
   public static Single getSingle(){
        if(single==null){
               synchronized(Single.class){
                        if(single==null){
                               single=new Single();              
                        }
                }
        }
        return single;
    }      
}



作者: 李林_    时间: 2015-7-19 11:03
楼上顶一个,楼主,假设现在有三个线程  我们来看怎样获取 Single 它的实例  。
             那么 线程1  进入 进入获取实例方法  进了synchronized (Single.class)同步方法后获取实例  出了同步方法,
                     线程2 继续进了同步方法发现实例不为空  出了同步方法,
                     线程3  继续进了同步方法发现实例不为空  出了同步方法。
             按楼上的进行走一遍,
                    线程1  进入获取实例方法  首先判断是否有 Single 它的实例。如果没有  进入synchronized (Single.class)同步方法 ,  同样再一次进入判断 没有 就获取 Single 它的实例。
                   线程2   首先会判断是否有实例,如果有就不进synchronized (Single.class)同步方法 。
                   线程3  同上。
       经过上边的分析,也就是说用楼上的方法,效率会高一些,那么会高在哪里?  我们首先来看  同步的机制,
当一个线程进了同步的方法时,另一个线程只有等到  进入同步的线程走完了后才能 进去,大大影响了效率。
     ps.  真正运行的时候  不一定是按我所分析的线程1、线程2、线程3这个顺序来的,取决于电脑的cpu,但是流程基本差不多,  还有一点 , 就是 static  有这个修饰符说明在jvm加载 class是的时候就给他一份空间,不在堆区和栈区。同时也方便更好的调用,final ,就不用说了吧!
作者: gaoming971366    时间: 2015-7-19 11:05
懒汉式,恶汉式,学习了
作者: 张玉久    时间: 2015-7-19 11:15

作者: 游呤人    时间: 2015-7-19 23:11
李林_ 发表于 2015-7-19 11:03
楼上顶一个,楼主,假设现在有三个线程  我们来看怎样获取 Single 它的实例  。
             那么 线程1   ...

多谢回复 是我欠考虑了
作者: 游呤人    时间: 2015-7-19 23:18
李林_ 发表于 2015-7-19 11:03
楼上顶一个,楼主,假设现在有三个线程  我们来看怎样获取 Single 它的实例  。
             那么 线程1   ...

那么如果我标记的是方法呢
作者: Xia_    时间: 2015-7-19 23:34
我居然看不懂:'(  恶补去




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2