1. 程式人生 > >java單例模式的個人理解

java單例模式的個人理解

nbsp java ack ron 懶漢式 靜態 解決方法 復雜 例如

下面是我個人對java單例模式的個人理解

java單例設計模式是先輩們走過很多彎路才寫出來的一些方法模式,總共有二三種模式。
單線程:
只有這個屬性為null時才能創建,構造函數私有,確保每次都只創建一個,避免重復創建。
缺點:只在單線程的情況下正常運行,在多線程的情況下,就會出問題。例如:當兩個線程同時運行到判斷instance是否為空的if語句,並且instance確實沒有創建好時,那麽兩個線程都會創建一個實例。
雙線程:
當兩個線程同時想創建實例,由於在一個時刻只有一個線程能得到同步鎖,當第一個線程加上鎖以後,第二個線程只能等待。第一個線程發現實例沒有創建。第一個線程釋放同步鎖,第二個線程才可以加上同步鎖,執行下面的代碼。由於第一個線程已經創建了實例,所以第二個線程不需要創建實例。保證在多線程的環境下也只有一個實例。

缺點:每次通過getInstance方法得到這個實例的時候都有一個試圖去獲取同步鎖的過程。加鎖是很耗時的。能避免則避免。
解決方法就是加雙判斷,然後加上synchronized同步鎖就可以解決啦,個人感覺有點復雜,可能容易出錯。

餓漢式:
餓漢式總體來說還是很好用的比如我們在Student類裏面寫一個靜態的方法不需要創建實例,它仍然會早早的創建一次實例。而降低內存的使用率。

懶漢式: 創建實例比較晚,類加載時不會創建實例,當調方法獲取時才會創建。

java單例模式的個人理解