美文网首页
理解单例模式

理解单例模式

作者: 梦的飞翔_862e | 来源:发表于2018-11-19 11:28 被阅读0次
概念理解

单例模式是最简单的设计模式之一,简单理解就是一个类在整个系统运行环境中只有一个实例。这是一种创建型模式,典型的特点是构造器私有化,然后提供一个静态公共 方法获取实例。创建单例饿汉式(类加载时就创建),懒汉式(第一次使用时创建)。

饿汉式:

实现非常简单,在声明属性中直接创建,这种方式是线程安全的,只是可能会造成空间的浪费(创建了却没有地方使用)。

//非懒加载,线程安全,一般推荐这种方式
public class ChocolateFactory {
    private boolean empty;
    private boolean boiled;
    private static ChocolateFactory INSTANCE = new ChocolateFactory();
    private ChocolateFactory() {
        this.empty = true;
        this.boiled = false;
    }
    public static ChocolateFactory getInstance(){
        return INSTANCE;
    }
}
懒汉式:

懒汉式即在第一次使用的时候创建实例,这里提供了一种线程不安全的和三种线程安全的实现方式

public class ChocolateFactory {
    private boolean empty;
    private boolean boiled;

    private static ChocolateFactory INSTANCE = null;

    private ChocolateFactory() {
        this.empty = true;
        this.boiled = false;
    }

    //线程不安全
    public static ChocolateFactory getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new ChocolateFactory();
        }
        return INSTANCE;
    }

    //线程安全
    public synchronized static ChocolateFactory getInstanteThreadSec() {
        if (INSTANCE == null) {
            INSTANCE = new ChocolateFactory();
    }
        return INSTANCE;
    }
}

在方法上加锁,虽然实现了线程安全,但是当线程并发量大的时候,会造成排队浪费时间的现象,因此使用双重锁机制比较好。

public class ChocolateFactory {
    private boolean empty;
    private boolean boiled;

    private  volatile static ChocolateFactory INSTANCE= null;

    private ChocolateFactory(){
        this.empty=true;
        this.boiled=false;
    }

    public static ChocolateFactory getInstante(){
        if(INSTANCE==null){
            synchronized (ChocolateFactory.class){
                if(INSTANCE==null){
                    INSTANCE = new ChocolateFactory();
                }
            }
        }
        return INSTANCE;
    }
}

还有一种方式是使用内部类,是基于饿汉式的一种改造

public class ChocolateFactory {

    private boolean empty;
    private boolean boiled;

    private ChocolateFactory() {
        this.empty = true;
        this.boiled = false;
    }

    //线程安全且是懒加载的
    public static class ChocolateFactoryHolder {
        private volatile static ChocolateFactory INSTANCE = new ChocolateFactory();
    }
    public static ChocolateFactory getInstance() {
        return ChocolateFactoryHolder.INSTANCE;
    }
}
volatile

volatile一种轻量级的同步机制,一个线程共享变量(静态变量)使用volatile修饰,表示这个变量是内存可见性,即一个线程修改了改变量,会立马通知另外的线程。
实际上,内存共享变量的写入和对另外线程的可见,都是通过java内存模型(JMM)控制的。共享变量存储在主内存中,每个线程都有自己的本地内存,存有使用到的主内存的副本拷贝,线程对变量的操作,都是在本地内存中进行,如果需要及时同步到主内存中,需要volatile关键字修饰。
完整代码实例参见https://github.com/jxl198/designPattern/tree/master/singleton

相关文章

  • python之理解单例模式

    python之理解单例模式 1、单例模式 单例模式(Singleton Pattern)是一种常见的软件设计模式,...

  • Java四种单例设计模式

    Java中的四种单例模式 单例模式是最容易理解的设计模式之一,介绍Java中单例模式的四种写法。 1.基本单例模式...

  • 【Java】设计模式 —— 深入浅出单例模式

    学习笔记 参考:深入浅出单实例SINGLETON设计模式单例模式【Java】设计模式:深入理解单例模式 场景:一般...

  • Go语言设计模式(1)单例模式

    Go语言设计模式(1)单例模式 单例模式的定义 个人认为单例模式是23种设计模式中最简单也最好理解的一种,定义如下...

  • 单例模式

    单例设计模式是几种设计模式中比较容易理解的,手写单例模式也是面试频繁问到的。下面总结一下单例模式的几种写法: //...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • java单例模式(推荐)

    单例模式有许多写法,可以结合自己理解选择一个自己喜欢的 引入一个其他人的博客关于单例的不错总结; 单例 单例模式 ...

  • 单例模式

    一、单例模式介绍 单例模式简而言之就是只有一个实例化对象的类,初学者可以通过单例 模式的设计更好的理解面向...

  • 理解单例模式

    概念理解 单例模式是最简单的设计模式之一,简单理解就是一个类在整个系统运行环境中只有一个实例。这是一种创建型模式,...

网友评论

      本文标题:理解单例模式

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