单例模式(Singleton)的创建

单例模式

饿汉模式
懒汉模式
序列化

单例模式:一个类重点内容中带有一个实例,该实例通过单例类提供给全局使用。

建一个单例模式的类的通用步骤:

  1. 创建一个类
  2. 编写一个类实例
  3. 编写无参构造器并用private修饰
  4. 编写获取实例的方法getInstance()

/**
* 饿汉模式
* 实例在类加载的时候就创建
*/

class Singleton01 {
    private static Singleton01 obj= new Singleton01();
    private Singleton01(){}

    public static Singleton01 getInstance() {
        return obj;
    }
}

/**
* 懒汉模式–线程不安全
* 下面代码,在多线程中存在非线程安全
* 假设线程一在创建Singleton02对象,而 obj = new Singleton02();不是一个原子操作
* 可以分为 jvm根据构造方法在栈区生成对应的对象,然后obj指向该对象的内存地址
* 所以可能存在另外一个线程在obj = new Singleton02();期间在new一个对象出来
*/

class Singleton02 {
    private static Singleton02 obj = null;
    private Singleton02() {}
    public static Singleton02 getInstance() {
        if(obj==null) {
            obj = new Singleton02();
        }
        return obj;
    }
}

/**
 * 懒汉模式--线程安全
 * 同步方法 可以达到线程安全,但是效率会变慢
 */
class Singleton03 {
    private static Singleton03 obj = null;
    private Singleton03(){}
    public synchronized static Singleton03 getInstance() {
        if(obj==null) {
            obj = new Singleton03();
        }
        return obj;
    }
}

/**
 * 懒汉模式--线程安全-DCL(Double Check Lock)
 * 权衡性能和安全
 * 并且使用volatile关键字修饰obj
 * volatile作用:
 * 提高被修饰对象在多个线程中的可见性
 * 禁止指令重新排序
 */

class Singleton04 {
    private static volatile Singleton04 obj = null;
    private Singleton04() {}
    public static Singleton04 getInstance() {
        if(obj==null){
            synchronized (Singleton04.class) {
                if(obj==null)
                obj = new Singleton04();
            }
        }
        return obj;
    }
}

/**
* 反序列化的单例模式
* 加入readResolve()方法读取“假”的实例 达到单例的作用
*/

class Singleton05 implements Serializable {
    private static volatile Singleton05 obj = new Singleton05();
    private Singleton05(){}
    public static Singleton05 getInstance() {
        return obj;
    }

    protected Object readResolve() throws ObjectStreamException{
        return obj;
    }
}

有什么错漏请各位指出,虚心学习,谢谢。

你可能感兴趣的:(总结,设计模式)