文档章节

Java 单例模式 学习

kipeng300
 kipeng300
发布于 2017/07/21 11:24
字数 571
阅读 5
收藏 0

#单例模式学习

##饿汉式

public class SingleDemo {
    private static final SingleDemo s = new SingleDemo();

    public static SingleDemo getInstance(){
        return s;
    }


}

##懒汉式

  • 普通懒汉式

public class SingleDemo2 {
    private static SingleDemo2 s2;

    public static SingleDemo2 getInstance() {
        if (null == s2) {
            s2 = new SingleDemo2();

        }

        return s2;
    }


}

上面这种线程不安全


public class SingleDemo3 {
    private static SingleDemo3 s;

    public static synchronized SingleDemo3 getInstance(){
        if(null == s){
          s = new SingleDemo3();
        }
        return s;
    }
}

线程安全 耗时严重 同步getInstance()的方法既简单又有效。但是你必须知道,同步一个方法可能造成程序执行效率下降100倍。因此,如果getInstance()使用频繁的话,就需要考虑其他方法了.所以我们没有必要因空间而失去时间,在这个用户体验的时代不值得.

  • double check 懒汉式
public class SingleDoubleCheck {
    private static SingleDoubleCheck s;

    public static SingleDoubleCheck getInstance() {
        if (null == s) {
            SingleDoubleCheck instance;
            synchronized (SingleDoubleCheck.class) {
                instance = s;
                if (null == instance) {
                    synchronized (SingleDoubleCheck.class) {
                        if (null == instance) {
                            instance = new SingleDoubleCheck();

                        }
                    }
                    s = instance;
                }
            }

        }

        return s;
    }
}


  • 内部类懒汉式

public class SingleInnerClass {



    private static class InnerSingleClass{
        private static final SingleInnerClass s = new SingleInnerClass();

    }

    public static SingleInnerClass getInstance(){
        return  InnerSingleClass.s;
    }



}

静态内部类 懒汉式 这周方式是利用了类加载的一些特性,在classloder的机制中,初始化instance时只有一个线程,而且这种方式还有一个好处就是起到了延时加 载的效果,当SingletonDemo4被加载了,但是内部类InnerSingleton并不会被加载,因为InnerSingleton没有主动使用,只有通过调用 getInstance方法时才会去加载InnerSingleton类,进而实例private static final SingletonDemo4 instance = new SingletonDemo4(); 因此这种巧妙的方式比起双重检查锁来说,安全来又高效了些.

##总结一下:

对于下面的单例总的来说各有各的优点,至于开发中使用哪个可以根据你的业务需求来选择.

####饿汉

  • 标准饿汉 (安全防护方面 枚举单例更优于标准饿汉)
  • 线程安全,高效,不可以懒加载
  • 枚举单例
  • 线程安全,高效,不可以懒加载(天然避免反射与反序列化)
  • 懒汉 (效率方面 静态内部类更优于标准懒汉)

####标准懒汉

  • 线程安全,低效,可以懒加载
  • 双重检测(不推荐,有bug)
  • 线程安全,低效,可以懒加载
  • 静态内部类
  • 线程安全,低效,可以懒加载

© 著作权归作者所有

共有 人打赏支持
kipeng300
粉丝 6
博文 39
码字总数 26283
作品 0
浦东
程序员
私信 提问
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
关于spring是用注解好,还是用xml好?

最近学习了一下java的工厂设计模式,感觉工厂模式最大的优点和spring的IOC有些相像,比如我们为一个User接口写了多个实现,记为:UserImpl1、UserImpl2,可以很轻松的来回切换实现,对于工厂...

上帝爱众生
2015/05/19
435
6
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部