1.单例模式概念:
2.饿汉式
饿汉就是一个迫切的意思,类加载就会导致该单实例被创建
饿汉式第一种方式:
class Singleton{
//在本类中创建本类对象
    private static Singleton instance=new Singleton();
//提供一个公共的访问方式,让外界获取该对象
    public static Singleton getInstance(){
        return instance;
    }
//私有构造方法
    private Singleton() {
    }
} 
我们来对上面这个饿汉式解析一下:
饿汉式第二种方式:
class Singleton2{
private static Singleton2 instance ;
static {
    instance=new Singleton2();
}
//对外提供方法获取该对象
public static Singleton2 getInstance(){
    return instance;
}
    //私有化的构造方法
    private Singleton2() {
    }
} 
 
 
饿汉式第三种方式(枚举方式):
public enum Singleton3{
    instance;
} 
 
 
饿汉式总结说明:
这种方式在成员位置声明Singlleton类型的静态变量,并创建Singleton类的对象instance。instance对象会随着类的加载而创建。如果对象足够大1的话,而一直没有使用就会造成内存的浪费
2.懒汉式
类加载不会导致该单实例对象被创建,而是首次使用才会被创建
懒汉式第一种方式(线程不安全的):
class Singleton3{
//声明成员变量,不进行初始化
    private static Singleton3 instance;
//提供获取对象的方法
    public static Singleton3 getInstance(){
        if(instance==null){
            instance=new Singleton3();
        }
        return instance;
    }
//私有化的构造方法
    private Singleton3() {
    }
} 
 
 
懒汉式第二种方式(线程安全的):
class Singleton3{
    private static Singleton3 instance;
    public static synchronized Singleton3 getInstance(){
        if(instance==null){
            instance=new Singleton3();
        }
        return instance;
    }
    private Singleton3() {
    }
} 
 
 
懒汉式第三种方式(双重检查锁):
class Singleton3{
    private static Singleton3 instance;
    public static synchronized Singleton3 getInstance(){
        if(instance==null){
            synchronized (Singleton3.class){
                if(instance==null){
                    instance=new Singleton3();
                }
            }
        }
        return instance;
    }
    private Singleton3() {
    }
} 
 
 
对双重检查锁的优化:
class Singleton3{
    private static volatile Singleton3 instance;
    public static synchronized Singleton3 getInstance(){
        if(instance==null){
            synchronized (Singleton3.class){
                if(instance==null){
                    instance=new Singleton3();
                }
            }
        }
        return instance;
    }
    private Singleton3() {
    }
} 
添加volatile关键字之后,能够保证多线情况下的线程安全也不会有性能问题
懒汉式第四种方式(静态内部类):
class Singleton4{
private static class SingletonHolder{
private final static Singleton4 INSTANCE=new Singleton4();    
}
public static Singleton4 getInstance(){
    return SingletonHolder.INSTANCE;
}
    private Singleton4() {
    }
} 
 
静态内部类的方式在没有加锁的情况下,保证了线程安全,有没有影响性能和空间的浪费










