特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
一、饿汉式单例
//饿汉模式
public class Hungry {
//可能会浪费资源
private byte[] bytes1 = new byte[1024*1024];
private byte[] bytes2 = new byte[1024*1024];
private byte[] bytes3 = new byte[1024*1024];
private byte[] bytes4 = new byte[1024*1024];
private Hungry(){}
private final static Hungry HUNGRY = new Hungry();
public Hungry getInstance(){
return HUNGRY;
}
}
二、懒汉式单例(双重检测锁 + 原子性操作)
public class Singleton{
private static Boolean flag = false;
private Singleton(){
if(!flag){
flag = true;
}else{
throw new RuntimeException("不要试图用反射破坏单例模式");
}
}
private static volatile Singleton singleton = null;
public static Singleton getInstance(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
三、静态内部类(非线程安全)
package com.dana.single;
public class Holder {
private Holder(){}
public static Holder getInstance(){
return InnerClass.HOLDER;
}
public static class InnerClass{
private static final Holder HOLDER = new Holder();
}
}
四、枚举
public enum EnumSingle {
INSTANE;
public EnumSingle getInstane(){
return INSTANE;
}
//test
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
EnumSingle instane = EnumSingle.INSTANE;
System.out.println(instane);
Constructor enumSingleConstructor =
EnumSingle.class.getDeclaredConstructor(String.class,int.class);
enumSingleConstructor.setAccessible(true);
EnumSingle enumSingle = enumSingleConstructor.newInstance();
//异常:Cannot reflectively create enum objects
System.out.println(enumSingle);
}
}



