bingoogolapple.github.io icon indicating copy to clipboard operation
bingoogolapple.github.io copied to clipboard

单例模式

Open bingoogolapple opened this issue 10 years ago • 4 comments

饿汉式

饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变

package cn.bingoogolapple.designpattern.singleton;

/**
 * 作者:王浩 邮件:[email protected]
 * 创建时间:2017/8/7 上午8:56
 * 描述:饿汉式
 */
public class SingletonA {
    private static SingletonA instance = new SingletonA();

    /**
     * 构造方法必须是私有的
     */
    private SingletonA() {
    }

    /**
     * 提供能够对该实例加以访问的全局访问方法
     * @return
     */
    public static SingletonA getInstance() {
        return instance;
    }
}

bingoogolapple avatar Sep 29 '14 01:09 bingoogolapple

懒汉式

package cn.bingoogolapple.designpattern.singleton;

/**
 * 作者:王浩 邮件:[email protected]
 * 创建时间:2017/8/7 上午8:58
 * 描述:懒汉式
 */
public class SingletonB {
    private static SingletonB instance = null;

    /**
     * 构造方法必须是私有的
     */
    private SingletonB() {
    }

    /**
     * 这种方式的坏处是,当有线程在占有该资源时,其他线程都必须在该方法外部等待
     */
    public static synchronized SingletonB getInstance() {
        if (instance == null) {
            instance = new SingletonB();
        }
        return instance;
    }
}

bingoogolapple avatar Sep 29 '14 01:09 bingoogolapple

双重检查

package cn.bingoogolapple.designpattern.singleton;

/**
 * 作者:王浩 邮件:[email protected]
 * 创建时间:2017/8/7 上午8:59
 * 描述:双重检测
 */
public class SingletonC {
    private static volatile SingletonC instance = null;

    /**
     * 构造方法必须是私有的
     */
    private SingletonC() {
    }

    public static SingletonC getInstance() {
        if (instance == null) {
            // [1]
            synchronized (SingletonC.class) {
                if (instance == null) {
                    //线程一在此之前线程二到达了位置[1],如果此处不二次判断,那么线程二执行到这里的时候还会重新new
                    instance = new SingletonC();
                }
            }
        }
        return instance;
    }
}

bingoogolapple avatar Sep 29 '14 01:09 bingoogolapple

静态内部类

package cn.bingoogolapple.designpattern.singleton;

/**
 * 作者:王浩 邮件:[email protected]
 * 创建时间:2017/8/7 上午9:09
 * 描述:静态内部类的方式实现单例模式
 */
public class SingletonD {
    /**
     * 构造方法必须是私有的
     */
    private SingletonD() {
    }

    /**
     * 静态内部类保存 SingletonD 的单例。SingletonHolder 会在外部调用 SingletonD.getInstance() 时才会被加载,从而实现懒加载
     */
    private static class SingletonHolder {
        private static final SingletonD INSTANCE = new SingletonD();
    }

    public static SingletonD getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

bingoogolapple avatar Sep 29 '14 01:09 bingoogolapple

枚举实现

package cn.bingoogolapple.designpattern.singleton;

/**
 * 作者:王浩 邮件:[email protected]
 * 创建时间:2017/8/7 上午9:01
 * 描述:通过枚举实现单例模式
 */
public enum SingletonE {
    INSTANCE;

    /**
     * 数据库连接池
     */
    private Object dataSource;

    /**
     * 枚举的构造方法默认就是 private 的
     */
    SingletonE() {
        // TODO 初始化数据库连接池
    }

    public Object getConnection() {
        // TODO 返回数据库链接
        return null;
    }
}

bingoogolapple avatar Aug 07 '17 01:08 bingoogolapple