bingoogolapple.github.io
bingoogolapple.github.io copied to clipboard
单例模式
饿汉式
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
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;
}
}
懒汉式
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;
}
}
双重检查
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;
}
}
静态内部类
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;
}
}
枚举实现
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;
}
}