0%

Java设计模式之单例模式

单例模式指的是一个类永远都只有一个实例,如需要共享某对象,需要对资源统一管理,就可以用单例。 饿汉模式:

 public class Singleton {
    private final static Singleton INSTANCE = new Singleton();
 
    // Private constructor suppresses   
    private Singleton() {}
 
    // default public constructor
    public static Singleton getInstance() {
        return INSTANCE;
    }
  }

很简单,不解释。 懒汉模式:

package com.pocketdigi.patterns.singleton;

public class Singleton {
    private int a;
    /**
     * 需要用volatile修饰
     * 原因:
     *      new Singleton()非原子操作,不能一步完成。分三步:、
     *          1、给Singleton实例分配空间 
     *          2、初始化Singleton构造器
     *          3、将instance指定实例的引用
     *      但JVM可能乱序执行,不一定是1-2-3,也可能是1-3-2,当1-3-2时,执行完3,
     *      instance就不会==null了, 如果此时CPU刚好切换到另一个线程上,
     *      会导致这个线程得到的实例没有初始化
     */
    private volatile static Singleton instance;

    /**
     * private的构造方法,确保不会在外部被调用
     */
    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            //用同步块,保证多线程访问时new Singleton只会执行一次
            synchronized (Singleton.class) {
                //后面的线程,可能进了if,在synchronized前等待,所以这里还要再判断一次是否==null
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

使用懒汉模式时,一定要注意。 调用:

        //单例
        Singleton singleton=Singleton.getInstance();
        singleton.setA(10);
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton2.getA());