设计模式 单例模式

一、定义

关于单例模式的定义,设计模式书中肯定都有,我就直接引用了:

单例模式确保一个类只有一个实例,并提供一个全局访问点。 –摘自《Head First 设计模式》

在设计模式中,单例模式可以说是最简单的一个模式了,因为单例模式只涉及到一个类,并且用法也只有固定那么几种,几乎早被开发者用烂了。话不多说,其实也没啥可说的,直接上具体用法吧,估计都会,就当是自己的一个知识点总结了。

二、用法

在这里我就不介绍懒汉模式、饿汉模式了,估计大家肯定耳朵都磨出茧子了,我就直接列举一下日常开发中常用的书写方式。

使用双重检查加锁的方式,之所以不在getInstance()方法上加上synchronized关键字,是因为同步一个方法可能会造成程序执行效率下降100倍,对性能非常有影响,所以这就要求我们对于同步方法的使用频率要尽可能的少。

public class SingletonOne {
    private volatile static SingletonOne singletonOne = null;

    private SingletonOne() {}

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

我们之所以使用volatile关键字,是因为volatile确保了应用中的可视性,如果你将一个域声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改。即便使用了本地缓存,情况也是如此,volatile域会立即被写入到主存中,而读取操作就发生在主存中(摘自java编程思想)。其实就是为了防止编译器优化指令执行,防止指令重排序问题,让每次操作都是到主存中对同一份数据进行读写,防止发生问题。

使用静态内部类的方式

public class SingletonTwo {

    private SingletonTwo(){}

    public static SingletonTwo getInstance() {
        return InterSingleton.singletonTwo;
    }

    private static class InterSingleton {
        private static SingletonTwo singletonTwo = new SingletonTwo();
    }
}

当未使用InterSingleton 静态内部类时,InterSingleton 类并不会被初始化,所以能达到延迟实例化的目的,同时在静态初始化器中创建单件,也保证了线程的安全。

猜你喜欢

转载自blog.csdn.net/MingJieZuo/article/details/79926545