饿汉式单例
package com.jialidun.gof.single;
//饿汉式单例
public class Hungry {
//1.构造器私有
private Hungry(){
}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance(){
return HUNGRY;
}
}
懒汉式单例
package com.jialidun.gof.single;
//懒汉式单例
public class LazyMan {
private LazyMan(){}
private volatile static LazyMan lazyMan;
public static LazyMan getInstance(){
// 单线程的懒汉式单例,如果多线程操作下,势必会出错
// if(lazyMan == null){
// lazyMan = new LazyMan();
// }
// return lazyMan;
//双重检测锁模式 懒汉式单例 DCL懒汉式
if(lazyMan == null){
synchronized (LazyMan.class){
if(lazyMan == null){
lazyMan = new LazyMan();
}
}
/*
即使这样还会出现错误,指令重排现象:
因为程序并不是按程序员编写的程序一行一行执行,
因此要保证原子性,使用关键字:volatile
*/
}
return lazyMan;
}
}
静态内部类单例
package com.jialidun.gof.single;
//静态内部类实现单例
public class Holder {
private Holder(){
}
public static Holder getInstance(){
return InnerClass.HOLDER;
}
public static class InnerClass{
private static final Holder HOLDER = new Holder();
}
}
枚举单例模式
package com.jialidun.gof.single;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* enmu本身也是一个类
*/
public enum EnumSingle {
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}
class Test{
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
EnumSingle instance1 = EnumSingle.INSTANCE;
Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(String.class,int.class);
declaredConstructor.setAccessible(true);
EnumSingle instance2 = declaredConstructor.newInstance();
System.out.println(instance1);
System.out.println(instance2);
}
}
枚举类型不能被反射破坏