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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 游呤人 中级黑马   /  2015-7-19 01:21  /  899 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 游呤人 于 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 李林_三位的回复

11 个回复

倒序浏览
回复 使用道具 举报
挺好的哈哈。
回复 使用道具 举报
温习了一半
回复 使用道具 举报
补充说明:懒汉式与饿汉式的区别在于:懒汉式是在调用时才产生实例化对象。
回复 使用道具 举报
本帖最后由 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;
    }      
}


回复 使用道具 举报
楼上顶一个,楼主,假设现在有三个线程  我们来看怎样获取 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 ,就不用说了吧!
回复 使用道具 举报
懒汉式,恶汉式,学习了
回复 使用道具 举报
回复 使用道具 举报
李林_ 发表于 2015-7-19 11:03
楼上顶一个,楼主,假设现在有三个线程  我们来看怎样获取 Single 它的实例  。
             那么 线程1   ...

多谢回复 是我欠考虑了
回复 使用道具 举报
李林_ 发表于 2015-7-19 11:03
楼上顶一个,楼主,假设现在有三个线程  我们来看怎样获取 Single 它的实例  。
             那么 线程1   ...

那么如果我标记的是方法呢
回复 使用道具 举报
Xia_ 中级黑马 2015-7-19 23:34:00
12#
我居然看不懂:'(  恶补去
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马