單例模式,確保每一給類只有一個實例,而且自行實例化並向整個系統提供這個實例
一:經典實現
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;
}
}