Singleton单例设计模式

定义:单例设计模式确保一个类只有一个实例,并提供一个全局访问点。所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控制,而应该由代码来限制,强制单例。单例有其独有的使用场景,一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之类的存在,一般都需要使用一个实例来进行记录,若多例计数则会不准确。

其中单例设计模式包含懒汉式和恶汉式:

1.饿汉式:

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

它是线程安全的单例设计模式。

2.懒汉式:

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

       但是它是线程不安全的单例设计模式,要把它改为线程安全的单例设计模式,需要加上同步关键字(synchronized)。

3.线程安全的懒汉式:

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

这种线程安全的懒汉式,要加锁,但是效率太低了,每次都需要加锁。

4.一种效率高且线程安全的懒汉式:

public class Singleton {
    private volatile static Singleton singleton;
    private Singleton() {}
    public static Singleton getSingleton() {
	if (singleton == null) {
	    synchronized (Singleton.class) {
		    if (singleton == null) {
		        singleton = new Singleton();
		    }
	    }
	}
	return singleton;
    }
}

其中使用volatile关键字,在高并发的场景下,当一个线程实例化了之后,volatile关键字 ,将该线程实例化,让其他线程可以看到,提供程序的效率。


 jdk中的Runtime类其实也是一种单例模式;Spring单例是指一个Spring Bean容器(ApplicationContext)中仅有一个实例。

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/82153881