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