单例设计模式-饿汉式
生活随笔
收集整理的這篇文章主要介紹了
单例设计模式-饿汉式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可以說是單例模式中寫法最簡單的一個方式,這個就是餓漢式,也就是在類加載的時候,就完成實例化,那他雖然簡單,有沒有什么值得研究的地方呢,當然是有的,首先我們先完成一個餓漢式的簡單實現
package com.learn.design.pattern.creational.singleton;import java.io.Serializable;/*** * @author Leon.Sun**/
public class HungrySingleton implements Serializable,Cloneable{/*** 我們直接聲明* 讓我們引用類名來做hungrySingleton* 我們首先new一個HungrySingleton* 也就是說在類加載的時候* 就初始化了* 當然這個在類加載的時候就初始化* 我們可以把它做成final的* 這樣這個對象就不可改了* 在類加載的時候就初始化加載好了* 也不需要更改了* 這個final看具體的情況* 這個就是一個非常簡單的餓漢式* 優點是寫法簡單* 類加載的時候就完成了初始化* 避免了線程同步的問題* 缺點也是應為在類加載的時候呢就完成初始化* 沒有延遲加載的效果* 如果這個類從始至終我的系統沒有用過* 那會造成內存的浪費* 我們也可以把這個實例化的過程放到靜態代碼塊里面* * * */private final static HungrySingleton hungrySingleton;/*** 我們試一下static* 我們使用過靜態塊* 來初始化properties的配置文件* * */static{/*** 然后new一下* 這里報紅線了* 因為上面是final的* 也給他初始化了* 所以靜態塊里邊* 并不能初始化* 如果用靜態塊的話* 我們可以把后面的new刪除掉* private final static HungrySingleton hungrySingleton;* 這樣就可以了* 那聲明為final的變量* 必須在類加載完成時* 已經賦值* 第一種方式呢* 直接new出來* 或者放到靜態塊里邊* 這個都能完成在類加載的時候就完成賦值* 所以在lazy這種模式里邊* 它是不能修飾成final的* 因為他不是在類加載的時候就初始化好* 那對于餓漢式呢* 有用final的* 也有不用final的* 都可以* 因為餓漢和懶漢之間* 最大的區別就是延遲加載* 是在類加載的時候初始化* 還是調用之后初始化* 那這個修飾符我們也要注意* 這兩個效果都是一樣的* 只不過hungrySingleton在內存加載的時候* 把這個創建對象的過程* 放到了靜態代碼塊里邊* 那類加載的時候* 也會執行靜態代碼塊中的代碼* 進行初始化這個類的實例* 看上去餓漢式是最簡單的* 如果我們的資源浪費少的話* 用這種方式也是可以的* 因為這種方式比較簡單* 就不領著debug了* 多線程的時候也是沒有問題的* 因為類加載的時候就初始化好了* 所以這里面也不用做空判斷* 直接返回就可以了* 那這個就稱之為餓漢式* 前面我們還學過懶漢式* 那有什么技巧嗎* 很簡單* 餓漢式因為它很餓* 一上來就想吃東西* 所以就把這個對象一上來就new好了* 而懶漢式呢* 非常懶* 你不用他的時候他都不用創建對象* 可以利用這個記憶技巧記憶一下* 免得弄混* 我們會挖掘其他的安全隱患* * * */hungrySingleton = new HungrySingleton();}/*** 然后private的構造器* */private HungrySingleton(){if(hungrySingleton != null){throw new RuntimeException("單例構造器禁止反射調用");}}public static HungrySingleton getInstance(){/*** 直接return* */return hungrySingleton;}private Object readResolve(){return hungrySingleton;}@Overrideprotected Object clone() throws CloneNotSupportedException {return getInstance();}
}
?
總結
以上是生活随笔為你收集整理的单例设计模式-饿汉式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单例设计模式-静态内部类-基于类初始化的
- 下一篇: 单例设计模式-序列化破坏单例模式原理解析