单例模式 分析 代码优化

  单例模式是23种设计模式之一,是比较简单的一种设计模式,它的目的是无论调用多少次,都返回同一个对象,它的特点是构造器私有化。

  它分为两种结构,一种是懒汉式的,一种是饿汉式的,它们各有优缺点,我们先从饿汉式看起,代码如下:

public class Single {
    public static Single single = new Single();

    private Single() {

    }

    public Single getInstance() {
        return single;
    }

}

  通过上面的程序可以看出来虽然我们加载同一个对象的目的确实达到了,但当程序被加载的时候就会创建single这个对象,当这个类有多个这样的方法时,我们可能会用不到这个对象中大多数单例,就会造成对内存的浪费。所以就出现了懒汉式的单例模式,代码如下:

public class Single {
    public static Single single = null;

    private Single() {

    }

    public Single getInstance() {
        if(single==null){
            return new Single();
        }
        return single;
    }

}

  这样,只有当我们真正调用这个对象时它才会被new出来,但是这样是存在问题的。

  当上面的第二段代码在第一次加载的时候有两个线程对其进行了调用,则会产生两个不同的对象,所以是线程不安全的,这时候就会想到给这个方法加个锁,加锁之后的代码如下:

public class Single {
    public static Single single = null;

    private Single() {

    }

    public synchronized Single getInstance() {
        if (single == null) {
            return new Single();
        }
        return single;
    }

}

  这样做确实做到了线程安全,但是当加锁这个方法里面要执行很多东西,调用这个方法花费的时间会很长,这样对服务器来说是致命的,因为这个方法如果某个线程一直调用的话,其它的线程是没有办法调的,服务器就阻塞了,那么升级后的代码如下:

public class Single {
    public static Single single = null;

    private Single() {

    }

    public Single getInstance() {
        if (single == null) {
            synchronized (Single.class) {
                return new Single();
            }
        }
        return single;
    }
}

  仔细观察以后发现这样并没有锁住,当第一次同时有两个线程到达getInstance()方法if判断时,其中有一个肯定是阻塞的,当另外一个执行完以后,阻塞这个线程是不会再判断是否为空的,还是会创建一个对象的,这样又有多个对象被产生了,再对其进行升级,得到的代码如下:

public class Single {
    public static Single single = null;

    private Single() {

    }

    public Single getInstance() {
        if (single == null) {
            synchronized (Single.class) {
                if (single == null) {
                    return new Single();
                }
            }
        }
        return single;
    }
}

  这样就不会产生上面的问题,而且也只锁一次,因为第二次再执行这个方法时,会跳过if判断,直接返回single,不会再被锁,执行效率也会很高。

  但即使是这样,也还是有问题的,因为我们不能确定在内存中是先给对象赋值,还是先创建了这个对象,所以第二个程序有可能得到的是初始化一半了的对象,在jdk1.5之后,我们可以用volatile这个关键字来避免这种情况,代码如下:

public class Single {
    public static volatile Single single = null;

    private Single() {

    }

    public Single getInstance() {
        if (single == null) {
            synchronized (Single.class) {
                if (single == null) {
                    return new Single();
                }
            }
        }
        return single;
    }
}

  但是这种情况很少使用,d我在这里只是为了学习一下,嘻嘻

单例模式 分析 代码优化,布布扣,bubuko.com

时间: 2024-10-29 19:07:11

单例模式 分析 代码优化的相关文章

设计模式之单例模式分析

单例模式分为两大类:懒汉式和饿汉式 其最主要的区别在于: 懒汉式:指全局的单例实例在第一次被使用时构建 饿汉式:指全局的单例实例在类装载时构建 日常我们使用的最多也是懒汉式,懒汉式是按需加载,能够做到资源的最大利用 懒汉式: 虽然这样写没什么问题,但是如果是多线程时可能出现问题了,如果多个线程同时访问 都判断了instance是否为null可能会创建两个实例 这时想到用synchronized加锁 这样的话如果两个线程同时访问的话就会有一个是在等待,可以避免出现创建两个实例的情况当然这还是会有效

单例模式作用特点及常见的单例模式分析(6种单例模式分析)

单例模式: 即在整个生命周期中,对于该对象的生产始终都是一个,不曾变化. 保证了一个类仅有一个实例,并提供一个访问它的全局访问点. 作用: 在要求线程安全的情况下,保证了类实例的唯一性,线程安全. 在不需要多实例存在时,保证了类实例的单一性.不浪费内存. 特点: 公有的方法获取实例, 私有的构造方法, 私有的成员变量. 一,饿汉式* @Description 饿汉式单例     * 饿汉式单例关键在于singleton作为类变量并且直接得到了初始化,即类中所有的变量都会被初始化     * si

ARM流水线关键技术分析与代码优化

引 言    流水线技术通 过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一.ARM7处理器核使用了典型三级流 水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构.通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能. ARM7的三级流水线在执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作.ALU操作以及相关器件之间的数据传输.执行单元的工作往 往占用多个时钟周期,从而成为系统性能的瓶颈

.NET设计模式实例之单例模式( Singleton Pattern)

一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它. 二.解决的问题(What To Solve) 当一个类只允许创建一个实例时,可以考虑使用单例模式. 三.单例模式分析(Analysis)1.单例模式结构 Singleton类,定义一个私有变量instance;私有构造方法Singleton(

.net中的设计模式---单例模式

20170312:学习原因是公司用到sprint.net,托管方法,防止类多次实例化,浪费空间 .net设计模式: Net设计模式实例之单例模式( Singleton Pattern)  一 : 单例模式的简介:(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它.简单说就是单一模式:仅能有你一个人访问: 二.解

设计模式攻略——单例模式

单例模式分析 简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中, 任何一个时刻,单例类的实例都只存在一个(当然也可以不存在). 需求: 为什么要有单例模式呢,需求才是最根本的原因.那么究竟是为什么呢. 场景1.:需要我们做个winform的用户管理信息系统,那么我们需要有注册吧,ok,添加个注册按钮,点击注册按钮是不是应该弹出个注册的界面呢. 假如你做好了,你的boss来检查,好吧,注册一下吧,一点一个注册界面弹出来了,哎,又一点又一个注册界面出来了,哎,再一点又一个界

iOS性能优化:Instruments使用实战(转)

采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有用的用户使用Guide,当然如果不习惯官方英文可以在这里找到中文本翻译版本PDF参阅.Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数据.关于Instrument工具基本使用不在赘述.如

iOS性能优化:Instruments使用实战

iOS性能优化:Instruments使用实战 最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有用的用户使用Guide,当然如果不习惯官方英文可以在这里找到中文本翻译版本PDF参阅.Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数

<转>iOS性能优化:Instruments使用实战

最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有用的用户使用Guide,当然如果不习惯官方英文可以在这里找到中文本翻译版本PDF参阅.Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数据.关于Instrument工具基本使用不在赘述