Java效能優化之設計模式 單例模式

2021-07-14 00:22:11 字數 2961 閱讀 1133

單例模式是一種常用的軟體設計模式,常被用於乙個系統中乙個類只存在乙個例項的場合,從而方便對例項個數的控制並節約系統資源。」簡而言之,單例模式就是保證乙個類最多只能存在乙個例項物件。

使用場景:

1)對應於頻繁使用的物件,可以省略建立物件所花費的時間,對於一些大型物件,是一筆可觀的開銷。

2)由於減少了new物件,減輕系統記憶體使用頻率和gc開銷。

單例模式必須要有private訪問許可權的建構函式,確保該類不會被其他**例項化,其次是instance成員變數和getinstance方法必須是static,在實現方式上可以分成:懶漢模式和餓漢模式

懶漢模式:

顧名思義,lazy loading(延遲載入,一說懶載入),在需要的時候才建立單例物件,而不是隨著軟體系統的執行或者當類被載入器載入的時候就建立。當單例類的建立或者單例物件的存在會消耗比較多的資源,常常採用lazy loading策略。這樣做的乙個明顯好處是提高了軟體系統的效率,節約記憶體資源。下面我們看看最簡單的懶漢單例模式:

public 

class

singleton

public

static

singleton getinstance()

return

instance

;

}

}餓漢模式:相對於懶漢模式,餓漢模式也有其不足之處,在類被載入時就建立單例物件並且長駐記憶體,不管你是否使用到它;如果singleton類占用的資源比較多,勢必會降低資源利用率以及程式執行效率。

public 

class

singleton

public

static

singleton getinstance()

}在單執行緒環境下,多次呼叫getinstance()方法獲得的singleton物件均為同乙個物件。然而,實際應用環境中很多都會涉及到多執行緒,因此不得不考慮執行緒安全

的問題。

簡單的懶漢式在多執行緒情況下,可能出現多個執行緒同時呼叫getinstance

方法,此時都判斷instance為null,每個執行緒都會建立多個

singleton

例項,違背了單例模式的初衷。這說明懶漢式在多執行緒環境下不是執行緒安全的。於是想到在getinstance()

方法上同步鎖。

public 

class

singleton

public

static 

synchronized

singleton 

getinstance()

returninstance;}

}雖然這種在方法前加上同步鎖的方式可以解決多執行緒問題,但是在使用中通常只需在第一次建立物件,以後呼叫getinstance方法只需要返回已經例項化的singleton物件即可,但是因為同步鎖鎖住整個方法可能粒度過大,不利於效率。既然鎖方法不太好,那麼鎖**呢?

public 

class

singleton

public

static

singleton getinstance()

}return

instance;}

}在getinstance()方法裡,在判空語句後上鎖,判空處主要是為了效能考慮,如果物件已經例項化,直接返回,這樣做看似解決了執行緒安全問題,其實不然。設現有執行緒a和b,在t1時刻執行緒a和b均已通過判空語句;t2時刻時,a先取得鎖資源進入臨界區(被鎖的**塊),執行new操作例項instance物件,然後退出臨界區。t3時刻,b進入臨界區,執行new操作建立例項物件。很明顯singleton被例項化兩次。仍不能保證執行緒安全。基於此,又提出了雙重鎖校驗式。

public 

class

singleton

public 

staticsingleton getinstance() }}

return

instance;}

}在臨界區內部再進行一次斷空,解決了在臨界區同時例項化物件的情況,看似解決了問題,但是仔細思考,雙重鎖還是存在問題。比如有執行緒a和b,a首先進入臨界區在2處對instance進行初始化,同時b執行緒在外層1處判空,此時可能出現b執行緒返回乙個只被ax執行緒部分初始化的instance物件,導致

異常。於是提出了如下修改辦法:

public 

class

singleton

public

static

singleton getinstance()

instance

= tmpinstance;}}

return

instance;}

}或者:

public 

class

singleton

public

static

singleton getinstance() }}

return

instance;}

}以上兩種辦法能很好的解決雙重鎖失效的問題,當然很多時候直接使用餓漢模式就能保證執行緒安全,而不必使用懶漢模式。

設計優化之單例模式

寫乙個簡單的單例模式public class singleton private static singleton instance new singleton public static singleton getinstance 懶載入單例public class lazysingleton p...

設計優化之單例模式

寫乙個簡單的單例模式public class singleton private static singleton instance new singleton public static singleton getinstance 懶載入單例public class lazysingleton p...

java之單例設計模式

單例設計模式 乙個類有且僅有乙個例項,而且自行例項化然後提供給其他類。單例設計模式分為兩類 餓漢式和飽漢式。餓漢式指的是在類載入時建立。懶漢式指的是在使用的時候進行判斷,如果需要再建立。餓漢式的 如下 public class singlepattern public static singlepa...