单例模式多种方式实现
/**
* 单例模式
* 饿汉式:类加载就会导致该单实例对象被创建。该方式存在内存浪费问题。
* 懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象才会创建。
*/
public class SingleExample {
/**
* 饿汉式:静态成员变量
* 该方式存在内存浪费问题。
*/
private SingleExample(){}
private static SingleExample instance = new SingleExample();
public static SingleExample getInstance(){
return instance;
}
/**
* 饿汉式:静态代码块
* 该方式存在内存浪费问题。
*/
private SingleExample(){}
private static SingleExample instance;
static {
instance = new SingleExample();
}
public static SingleExample getInstance(){
return instance;
}
/**
* 懒汉式,
* 线程不安全
*/
private SingleExample(){}
private static SingleExample instance;
public static SingleExample getInstance(){
if(instance == null){
instance = new SingleExample();
}
return instance;
}
/**
* 懒汉式,
* 添加synchronized 关键字,线程安全
*/
private SingleExample(){}
private static SingleExample instance;
public static synchronized SingleExample getInstance(){
if(instance == null){
instance = new SingleExample();
}
return instance;
}
/**
* 懒汉式:双重检查方式
* 多线程情况下,可能会出现空指针问题,使用volatile关键字解决该问题
*/
private SingleExample(){}
private static volatile SingleExample instance;
public static SingleExample getInstance(){
//第一次判断,如果instance不为null,不需要抢占锁,直接返回对象
if(instance == null){
synchronized (SingleExample.class){
//第二次判断,如果instance不为null,直接返回对象
if(instance == null){
instance = new SingleExample();
}
}
}
return instance;
}
/**
* 懒汉式:静态内部类方式
*/
private static boolean flag = false;
private SingleExample(){
/**
* 反射破坏单例模式解决方案
*/
synchronized (SingleExample.class){
if(flag){
throw new RuntimeException("不能创建多个对象");
}
flag = true;
}
}
private static class SingleExampleHolder{
private static final SingleExample INSTANCE = new SingleExample();
}
public static SingleExample getInstance(){
return SingleExampleHolder.INSTANCE;
}
/**
* Serializable 序列化破解单例模式解决方案
*/
public Object readResolve() {
return SingleExampleHolder.INSTANCE;
}
}
通过枚举方式实现单例模式
public enum EnumSingleton {
INSTANCE;
public void doSomething(){
System.out.println("枚举方式实现单例模式");
}
}
调用:
EnumSingleton.INSTANCE.doSomething();