在Java中,可以通過以下兩種方式來實現單例模式:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
這種方式在第一次調用getInstance()
方法時才會創建實例,因此稱之為懶漢式。但是在多線程環境下,多個線程可能同時進入到instance == null
的判斷中,導致創建多個實例的問題。
為了解決多線程問題,可以對getInstance()
方法進行加鎖:
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
但是這樣會導致每次調用getInstance()
方法時都需要進行加鎖操作,降低了性能。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
在類加載時就創建實例,因此稱之為餓漢式。這種方式不存在多線程問題,但是如果該實例在整個程序的生命周期中很少被使用,會造成內存浪費。