单例设计模式

单例设计模式:(有常见的五种单例)

1.饿汉式
2.懒汉式(安全与非安全的懒汉式)
3.双重检测锁式
4.静态内部类式
5.枚举单例

目的:节约内存开销和CPU利用率。

特点:保证某一对象在系统中的唯一性,此对象在系统中只拥有一个实例。

适用性:

1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

适用性援引自《设计模式:可复用面向对象软件的基础》

1.饿汉式 单例模式

public class Singleton{
    private static Singleton instance=new Singleton();
    private Singleton(){}
    pulic static Singleton getInstance(){
        return instance;
    }
}

特点:立即加载,不论是否调用,不存在懒汉式的多线程问题(虚拟机保证只会装载一次该类,不会发生并发访问问题

2.懒汉式 单例模式

public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance==null)
            return instance=new Singleton();
        else
            return instance;
    }
}

特点:可以延时加载,它的优点是真正使用的时候才加载,有多线程问题,需要加锁。

2.1线程安全的懒汉式 单例模式

public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    public static synchronized Singleton getInstance(){
        if(instance==null)
            return instance=new Singleton();
        else
            return instance;
    }
}

特点:synchronized锁住整个getInstance()方法,效率低,因此出现了新的线程安全的懒汉式单例模式,也就是双重检测锁式

3.双重检测锁 单例模式

public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    public static sychronized Singleton getInstance(){
        if(instance==null)
            sychronized(Singleton.class){
                if(instance==null)
                    instance=new Singleton();
            }
        return instance;
    }
}

特点:常出现编译不通过的情况

原因:在虚拟机执行 instance=new Singleton();这句时,有可能会出现一种情况,虚拟机会给Singleton对象分配空间,并把空间地址赋给instance,但是空间里的对象并未完成实例化,然而此时本线程若结束,另外线程进入instance已不为空(已有对象的空间地址)然后返回instance,此时instance指向的是一个未完成实例化的空间,就会发生错误。

因此出现了更新的一种单例,静态内部类单例模式

4.静态内部类 单例模式

public class Singleton{        
    private Singleton(){           
    }        
    private static class SingletonContainer{        
        private static Singleton instance = new Singleton();        
    }        
    public static Singleton getInstance(){        
        return SingletonContainer.instance;        
    }        
}

特点:静态内部类SingletonContainer是单独的.class文件,在只加载单例不调用getInstance方法时,并不加载SingletonContainer类,JVM又保证被static修饰的类和方法只加载一次,杜绝了多线程的问题,因此此方法解决了,需要延时加载和线程安全的问题。

5.枚举 单例模式

请参考 https://www.cnblogs.com/cielosun/p/6596475.html

你可能感兴趣的:(Java,Java,单例模式,懒汉,饿汉,双重检测锁)