美文网首页
设计模式-单例设计模式

设计模式-单例设计模式

作者: woochen123 | 来源:发表于2017-09-17 22:46 被阅读0次

定义

应用内只存在类的一个实例

饿汉式

public class Singleton {
    public  static Singleton mInstance = new Singleton();

    private Singleton() {
    }
    
    public  static Singleton getInstance(){
        return mInstance;
    }
}

懒汉式

  • 方案一
public class Singleton {
    public static Singleton mInstance ;

    private Singleton() {
    }

    public static Singleton getInstance(){
        if (mInstance == null) {
            mInstance = new Singleton();
        } 
        return mInstance;
    }
}

存在问题:多线程并发时,可能new出多个对象

  • 方案二
public class Singleton {
    public static Singleton mInstance ;

    private Singleton() {
    }

    public synchronized static Singleton getInstance(){
        if (mInstance == null) {
            mInstance = new Singleton();
        }
        return mInstance;
    }
}

存在问题:多线程并发时,每个线程都需要判断一次同步锁,效率较低

  • 方案三(推荐)
public class Singleton {
    public static Singleton mInstance ;

    private Singleton() {
    }

    public  static Singleton getInstance(){
        if (mInstance == null) {
            synchronized (Singleton.class){
                if (mInstance == null) {
                    mInstance = new Singleton();
                }
            }
        }
        return mInstance;
    }
}

存在问题:存在不加关键字volatile的弊端
volatile的作用:

  1. 防止重排序( 1 分配一块内存空间 2 初始化对象(指向内存空间) 3赋值
    多线程时2,3可能会更换顺序,出现意想不到的错误)
  2. 线程可见(一个线程改变了公用对象,短时间内,可能对另一个线程不可见)
  • 方案四(推荐)
public class Singleton {
    public volatile static Singleton mInstance ;

    private Singleton() {
    }

    public  static  Singleton getInstance(){
        if (mInstance == null) {
            synchronized (Singleton.class){
                if (mInstance == null) {
                    mInstance = new Singleton();
                }
            }
        }
        return mInstance;
    }
}

静态内部类

public class Singleton {
    public static Singleton mInstance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.mInstance;
    }

    static class SingletonHolder {
        static Singleton mInstance = new Singleton();
    }
}

容器管理

public class Singleton {
    public static Map<String,Object> mSingleMap = new HashMap<>();

    static {
        mSingleMap.put("activity_manager",new Singleton());
    }

    private Singleton() {
    }

    public static Object getInstance(String name) {
        return  mSingleMap.get(name);
    }

}

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 设计模式之单例模式

    单例设计模式全解析 在学习设计模式时,单例设计模式应该是学习的第一个设计模式,单例设计模式也是“公认”最简单的设计...

  • 2、创建型设计模式-单例设计模式

    江湖传言里的设计模式-单例设计模式 简介:什么是单例设计模式和应用 备注:面试重点考查 单例设计模式:这个是最简单...

  • 设计模式第二篇、单例设计模式

    目录1、什么是单例设计模式2、单例设计模式的简单实现3、单例设计模式面临的两个问题及其完整实现4、单例设计模式的应...

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • 设计模式

    设计模式简介 单例设计模式 问题:单例设计模式是什么?为什么要学它?怎么用它? 1.定义:单例模式(Singlet...

网友评论

      本文标题:设计模式-单例设计模式

      本文链接:https://www.haomeiwen.com/subject/aznmsxtx.html