簡單的說就是同乙個類建立的n個物件時是需要花費大量的空間,此時我們可以用單例模式解決空間浪費的情況,保證每次建立的物件是同乙個物件,減少n個對空間的開銷。
class
singleton
//建立物件例項
private
final
static singleton instance =
newsingleton()
;//靜態方法,返回例項物件
public
static singleton getinstance()
}
這種單例模式優點是使用簡單,執行緒安全,而最典型的缺點是沒有懶載入,即在使用時建立物件,而是在類載入的時候例項化,這樣會導致一直沒有使用物件的情況下從而導致空間的浪費。
class
singleton
// 靜態**塊
static
//靜態方法,返回例項物件
public
static singleton getinstance()
}
這種單例模式與上面靜態常量的實現類似。
class
singleton
//靜態方法,當使用到該方法時才建立
public
static singleton getinstance()
return instance;
}}
這種單例模式彌補了靜態常量或者靜態**塊沒有懶載入的不足,它會在呼叫getinstance方式的時候建立物件,但是這種模式只能在單執行緒下使用,當乙個執行緒進入if(instance == null)判斷還沒來得急建立物件,而另外乙個執行緒搶占先機進入判斷語句裡從而執行建立物件語句,導致兩個執行緒建立的物件不是同乙個物件,這樣就造成了執行緒安全問題的存在,所以這種模式是不能在多執行緒模式下建立的。
class
singleton
//靜態方法,加入同步方法,解決執行緒安全問題
public
static
synchronized singleton getinstance()
return instance;
}}
此單例模式即保證了執行緒安全問題又達到了懶載入效果,由於每次呼叫方法都需要同步,造成了執行效率低的問題出現,實際上當引用為空時,建立一次物件後,後面再呼叫方法都不需要同步,即在建立物件時同步,後續都不需要同步直接return,返回物件。
class
singleton
//靜態方法,加入同步方法,解決執行緒安全問題
public
static singleton getinstance()
}return instance;
}}
這種單例模式與上面懶漢式的同步方法類似。
class
singleton
//加入雙重檢查,解決執行緒安全問題
public
static singleton getinstance()
}}return instance;
}}
這種單例模式解決了執行緒安全、懶載入,同時也解決了上面的執行效率低的問題,使用了兩次判斷,instance引用為空時,則建立物件,當再一次呼叫時通過第一次判讀為false而直接返回物件,而不需要每次都同步方法帶來的效率低的問題,此種方法也是實際開發中常用單例模式之一。
class
singleton
//靜態內部類
private
static
class
singletoninstance
//返回靜態內部類中的例項物件
public
static
synchronized singleton getinstance()
}
這種單例模式並不是一開始就例項化,而是在getinstance()方法被呼叫的時候才被類載入並初始化,進而達到懶載入,由於是在類載入的時候進行初始化,此時也保證了其他執行緒不能進入,執行緒安全也得到解決,此種方法也是實際開發中常用單例模式之一。
enum singleton
列舉模式實現測試:
class
singletontest
}
列舉實現單例不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立
新的物件,此種方法也是實際開發中常用單例模式之一。
單例模式(八種實現方式)
餓漢單例 優點 簡單 執行緒安全 缺點 浪費記憶體 我們的單例物件數量不可控的時候,可能會造成記憶體浪費 public class hungraysingleton 提供全域性訪問點 public final static hungraysingleton getinstance 餓漢靜態 塊 pu...
單例設計模式的八種方式
餓漢式 靜態常量 class singleton private final static singleton instance newsingleton public static singleton getinstance 優點 類載入的時候就完成例項化,避免了執行緒同步的問題 不足 沒有懶載入...
八種單例模式總結
先吐槽一下,這是誰起的名字,別說,還挺難聽。餓漢式1 2 靜態常量和靜態 塊 優點 這種寫法比較簡單,就是在類裝載的時候就完成例項化,避免了執行緒同步問題。缺點 在類裝載的時候就完成例項化,如果未使用過這個例項,會造成記憶體的浪費。public class singleton public stat...