单例模式可以保证应用中只有一个实例,具体的实现方式如下:
1.懒汉式:第一次调用的时候才初始化
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
经懒汉式存在的问题:无法避免多线程并发,所以可能会出现多个实例。
2.饿汉式:类加载的时候就初始化实例
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
}
3.懒汉式安全法(粗暴):给懒汉式加上锁,避免多线程并发导致的多实例
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
问题,多线程访问时,每一次调用都会synchronized,导致效率较低。解决方案如下:
4.懒汉式安全法(委婉)
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
只有第一次实例化的时候才会执行synchronized