文档章节

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
浦东
程序员
练就Java24章真经—你所不知道的工厂方法

前言 最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了 。计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式,是因...

codeGoogle
09/04
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
设计模式15——Template Method设计模式

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

小米米儿小
2014/01/24
0
0
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
android与模式:写之前的一点话

一直都喜欢研究模式,学习和使用也有很多年了,因为爱好,也因为需要。技术总是需要提高,兴趣在于看源码中领略到的精彩。对于设计模式,一直以来,断断续续的反复温习着,看看这个,看看那个...

今幕明
2014/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx的简单使用:负载均衡

nginx:反向代理的服务器;用户发送请求到nginx,nginx把请求发送给真正的服务器,等待服务器处理完数据并返回,再把数据发送给用户。 nginx作为一个反向代理服务器,能缓存我们项目的静态文...

osliang
27分钟前
2
0
网站title标题被改并被百度网址安全中心提醒的解决办法

国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百...

网站安全
29分钟前
1
0
JDK版本与major.minor version的对照关系

其实,只需要记住jdk6对于major.minor version 50即可,其他版本自行计算即可。 ---------------------

码代码的小司机
32分钟前
1
0
C++基础教程面向对象学习笔记及心得感悟[图]

C++基础教程面向对象学习笔记及心得感悟[图] 使用友元函数重载算术运算符: C ++中一些最常用的运算符是算术运算符 - 即加号运算符(+),减运算符( - ),乘法运算符(*)和除法运算符(/...

原创小博客
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部