文档章节

Java 单例模式 学习

kipeng300
 kipeng300
发布于 2017/07/21 11:24
字数 571
阅读 4
收藏 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
博文 35
码字总数 22422
作品 0
杭州
程序员
20个设计模式和软件设计面试问题

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

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

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

小米米儿小
2014/01/24
0
0
android与模式:写之前的一点话

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

今幕明
2014/03/06
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
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之所...

路小磊
07/21
0
10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 种族不同,禁止交往

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《苏菲小姐》- 鱼果 《苏菲小姐》- 鱼果 手机党少年们想听歌,请使劲儿戳(这里) @貓夏:下大雨 正是睡觉的好时候 临睡前...

小小编辑
今天
211
6
Python 搭建简单服务器

Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下: 1.等待客户端的链接,服务器会收到一个http协议的请求数据报 2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文...

代码打碟手
今天
1
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
今天
0
0
qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部