单例模式,确保每一给类只有一个实例,而且自行实例化并向整个系统提供这个实例
一:经典实现
public class Singleton{
private static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
这种写法很简单,但是缺点也很明显,在多线程中存在线程安全问题!
二:线程安全的方式
在JVM加载类是实例化,可以有效解决线程安全问题
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
三:双重加锁模式
该方式只有在第一次实例化是才会进行同步
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;
}
}
四:同步方式
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}