单例模式的多种写法

public class Singleton {
    private Singleton(){}//私有化构造器

    private static Singleton instance = null;  //类的内部创建对象

    public static Singleton getInstance(){  //暴露公共的get方法
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}
//饿汉
class Singleton2{
    private Singleton2(){}
    //只实例化一次,线程安全。     但是有些浪费空间
    private static Singleton2 instance = new Singleton2();

    public static Singleton2 getInstance(){
        return instance;
    }
}
//双重检测锁 懒汉模式
/*
 * 可能存在的问题:线程a进行第一次访问,①处为null拿到锁②也为null 执行③
 *     instance = new Singleton3() 会被编译器编译成JVM指令
 *
 *      memory = allocate();  //1.分配内存空间
 *      ctorInstance(memory);   //2.初始化对象
 *      instance = memory;   //3.将instance指向刚分配的地址
 *
 *      可能JVM将指令优化重排为  1 3 2
 *
 *  当a线程执行到3时CPU被b线程拿到,此时b线程①出不为null  直接返回instance
 *        而此时的instance只有内存地址,并没有初始化完成
 *
 *
 */
class Singleton3{

    private Singleton3(){}

    private static Singleton3 instance = null;

    public static Singleton3 getInstance(){

        if(instance == null){   //①
            synchronized (Singleton3.class) {
                if(instance == null){//②
                    instance = new Singleton3();  //③
                }
            }
        }
        return instance;
    }
}

//双重检测锁 懒汉模式   volatile
class Singleton4{

    private Singleton4(){}

    //volatile  阻止指令重排、禁用线程内存      保证每次都读写主内存的值
    private volatile static Singleton4 instance = null;

    public static Singleton4 getInstance(){

        if(instance == null){
            synchronized (Singleton4.class) {
                if(instance == null){
                    instance = new Singleton4();     //volatile修饰的变量不会指令重排
                }
            }
        }
        return instance;
    }
}

//双重检测锁 懒汉模式   volatile +优化
/*
 * volatile 阻止指令重排,读取volatile修饰的变量消耗的性能会比较大
 *
 * 所以创建临时变量,在instance不为null时,直接返回临时变量,不再去访问volatile的变量    提高25%的性能
 *
 */
class Singleton5{

    private Singleton5(){}

    private volatile static Singleton5 instance = null;

    public static Singleton5 getInstance(){
        Singleton5 inst = instance;   //创建临时变量

        if(instance == null){
            synchronized (Singleton5.class) {
                if(instance == null){
                    inst = new Singleton5();
                    instance = inst;
                }
            }
        }
        return inst;   //返回临时变量
    }
}
时间: 2024-10-30 04:03:37

单例模式的多种写法的相关文章

C#单例模式的多种写法

它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个.(<设计模式-基于C#的工程化实现及扩展>,王翔).也就是说,单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题. public class Singleton { private static Singleton instance; private Singleton() {

单例模式,多种实现方式JAVA

转载请注明出处:http://cantellow.iteye.com/blog/838473 第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } retu

单例模式几种写法

第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法lazy loading很明显,但是致命的是在多线程

单例模式的多种实现

单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.当一个类的实例有且只可以有一个的时候就需要用到单例模式了.为什么只需要有一个呢?有人说是为了节约内存,但这只是单例模式带来的一个好处.只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由.我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候.比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢? Singleton模式主要作用是保证

单例模式及常见写法分析(设计模式01)

保证一个类仅有一个实例,并提供一个该实例的全局访问点. --<设计模式> 单例模式的概念很简单,下面以C#语言为例子,列出常见单例写法的优缺点. 1.简单实现 public sealed class Singleton { static Singleton instance = null; public void Show() { Console.WriteLine( "instance function"); } private Singleton() { } publi

【WebFrontEnd】布局的多种写法

第一次写文章,巧紧张!!! 这是一个很简单的布局,不过是个值得深思的问题.对于这种布局,可以有多种HTML.CSS写法,那么到底可以有多少种写法呢? 我的思路是根据HTML的不同布局,写不同的CSS.这里为了效果,所以都给元素添加了固定的高度. 1.第一种HTML布局 1-1.第一种CSS布局: 这种写法是一个清除了浮动的父元素含有两个向左浮动的子元素,子元素各设置了宽度. 这种写法的缺点是不够灵活,父元素和子元素还有边距都是固定写死的, 如果父元素container宽度改变,aside宽度不变

单例模式的多种实现及优缺点比较

Head First一书中对单例模式的定义是:单例模式确保一个类只有一个实例,并提供一个全局访问点. 在很多实际场景应用中,我们希望某个类只能有一个实例化的对象,例如数据连接池,日志对象等等,这个时候我们就要使用单例模式了,单例模式的核心思想是私有化构造器,防止其他类任意实例化该类,具体的实现有多种,每种都会有其优缺点,让我们来仔细看看各种实现的差异吧. 依据我写代码的习惯,先上UML类图,我用的工具是StarUML,免费不需要破解哦:) 第一种实现: public class MyClass

Objective-c单例模式的正确写法--用dispatch 线程安全

单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考这篇文章. 单例顾名思义就是说一个类的实例只能有一个,在java.C++这类语言中,可以通过将构造函数私有化来避免对象的重复创建,但是objective-c却不能够这样做,我们需要通过其他机制来达到这个目的.一般情况下,可能我们写的单例模式是这样的: #import @interface Singl

模式--单例模式8种写法

单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生.一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式.但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧. 简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在. 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象