Java单例模式
1、饿汉模式
/*
* * 单例模式---饿汉模式
*
* 缺点:static修饰的成员在类加载的时候就已经存在于jvm中。即迫切加载,占用内存。
* 优点:不存在线程安全问题
*/
public class Single1 {
//1、构造方法私有。禁止外部利用构造方法随意(new)创建该类的对象
private Single1(){}
//2、创建实例对象,用private修饰,禁止外部随意调用字段创建对象。
//用static修饰使得该变量唯一,也就是单例
private static Single1 instance = new Single1();
//3、一个可以获取对象的方法,用static修饰。
//因为此方法是用来获取对象的,只能用类.方法调用,所以使用static修饰
public static Single1 getInstance(){
return instance;
}
}
2、懒汉模式
/*
* * 单例模式--懒汉模式
* 优点:不占用内存,在使用那一刻才创建对象
* 缺点:多线程访问时,存在线程安全问题
*/
public class Single2 {
//1、构造方法私有,禁止外部随意调用构造方法创建对象
private Single2(){}
//2、私有字段,禁止外部随意调用字段。
//用static修饰,使得该字段唯一,在类加载的时候就已经存在。
//在此没有创建对象,默认值为null。
//volatile 由于new Single2();并非原子性,用volatile 做指令重排的优化
private static volatile Single2 instance;
//3、一个可以创建对象的方法
public static Single2 getInstance() {
// 当第一次调用该方法的时候,需要创建对象,当再次调用该方法的时候,直接返回已经创建好的对象。
if (instance == null) {
// 解决线程安全问题,利用唯一的字节码作为共同的锁
synchronized (Single2.class) {
// 再次判断是否是第一次创建对象。由于在成功创建对象之后,此处有可能还有其他线程存在。
if (instance == null) {
instance = new Single2();
}
}
}
return instance;
}
}
3、枚举
/*
* 枚举创建单例对象
*/
public enum Single3 {
INSTANCE;
}