美文网首页程序员技术干货
Java 设计模式(4) —— 单例模式

Java 设计模式(4) —— 单例模式

作者: 磊_lei | 来源:发表于2018-05-06 16:06 被阅读28次

一、单例模式

确保一个类最多只有一个实例,并提供一个全局访问点

单例模式

二、为什么会需要单例

  • 有些对象我们只需要一个:线程池、缓存、硬件设备等
  • 如果多个实例会有造成冲突、结果的不一致性等问题
  • 是否可以用静态变量方式来实现?
  • 或者程序员之间协商个全局变量?

三、单例模式的实现

/**
 * 初步实现单例模式
 */
public class Singleton {

    private static Singleton uniqeInstance = null;

    private Singleton() {

    }

    // 利用静态方法和静态变量实现简单的单例
    public static Singleton getInstance() {
        if (uniqeInstance == null) {
            uniqeInstance = new Singleton();
        }
        return uniqeInstance;

    }

}

四、单例模式的优化

多线程的情况下为保证线程安全,需要对单例模式进行优化处理

优化方式:

  • 1.同步(synchronized)getInstance方法
public static synchronized ChocolateFactory getInstance() {

        if (uniqueInstance == null) {
            synchronized (ChocolateFactory.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new ChocolateFactory();
                }
            }
        }

        return uniqueInstance;

    }

该方法利用synchronized关键字加了同步锁,但是比较耗资源,每次都得加锁

  • 2.“急切”创建实例
public class ChocolateFactory {

    private boolean empty;
    private boolean boiled;
    public static ChocolateFactory uniqueInstance = new ChocolateFactory();

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

该方法在程序启动的时候就创建了一个对象,就算无调用也创建了,耗内存空间

  • 3.双重检查加锁(最优)
public class ChocolateFactory {

    private boolean empty;
    private boolean boiled;
    public volatile static ChocolateFactory uniqueInstance = null;

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

    public static ChocolateFactory getInstance() {

        if (uniqueInstance == null) {
            synchronized (ChocolateFactory.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new ChocolateFactory();
                }
            }
        }

        return uniqueInstance;

    }
}    

利用volatile关键字和双重验证以及同步锁,即保证了内存的合理分配和原子性,也无需每次都加上同步锁

Java设计模式所有示例代码,持续更新中

相关文章

  • JAVA设计模式 - 单例模式

    JAVA设计模式 - 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一...

  • 单例模式

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

  • Java中单例模式你用的哪一种?

    一起讨论java中的单例模式。单例模式是java设计模式中算是最简单的设计模式了。 * java实现单例模式的写法...

  • JAVA设计模式之单例模式

    JAVA设计模式之单例模式

  • 设计模式

    Java 设计模式情景分析 ——单例模式 Java 设计模式情景分析——建造者模式 Java 设计模式情景分析——...

  • Java设计模式教程

    Java设计模式教程 Java工厂设计模式 Java抽象工厂模式 Java单例模式 Java建造者(Builder...

  • 设计模式——单例模式

    设计模式——单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,这种类型...

  • 设计模式

    单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式...

  • 设计模式《一》单例模式

    单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属...

  • 设计模式之单例模式详解(附源代码)

    单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属...

网友评论

    本文标题:Java 设计模式(4) —— 单例模式

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