設計模式 單例模式

2021-08-21 20:22:06 字數 2718 閱讀 6406

關於單例模式,主要是為了乙個類每次在使用它的例項時,都是同乙個例項物件。

單例模式一

public class mysingleton   

public static mysingleton getinstance()

}

上述的單例模式**一定是執行緒安全的,並且每次呼叫都會返回同乙個物件,執行緒安全的原因是,靜態變數是在類的初始化過程當中賦值,這個類在呼叫的時候,如果沒有對類進行初始化,就會進行初始化。唯一的缺點就是,如果我們程式當中一直沒有呼叫getinstance方法,但是我們對這個類進行了初始化,會占用一定的記憶體空間,因此這種實現方式顯然不是最優的,

單例模式二

public class mysingleton  

static

public static mysingleton getinstance()

}

這個方式的實現和上面第乙個的方式實現方式基本上一樣,都是屬於在類初始化時候進行了物件的例項化,但是有可能初始化的時候,我們並沒有使用getinstance方法,因此就造成了空間上的浪費。注:靜態變數和靜態**塊都會在類初始化的時候盡心載入。

單例三由於上面兩個方式都存在記憶體浪費的一種情況,那我們就設計一種,在使用到這個物件的時候,在進行例項化的方式

public class mysingleton   

public static mysingleton getinstance()

return instance;

} }

很明顯這種方式最大的問題就是執行緒不安全,考慮到執行緒安全,就有了例項四的實現方式,直接在方法上加synchronious

單例四

public class mysingleton   

public synchronized static mysingleton getinstance()

} catch (interruptedexception e)

return instance;

} }

這種方式呢,即實現了執行緒安全,又省了空間,但是呢,也有它的問題synchronous這個鎖加的範圍太大了,那麼接下來就有了下面的,同步**塊,只對需要加鎖的地方進行加鎖,用不到的都不加鎖。

單例五

public class mysingleton   

public static mysingleton getinstance()

}

} catch (interruptedexception e)

return instance;

} }

這個看起來已經很完美了,寫個**測試下

class mythread extends thread

}---------------------------------------------

public static void main(string args)

for(int i = 0; i < thread.length; i++ )

}

上述列印出來的hash值並不相同,原因在於雖然我們對建立部分進行了加鎖,但是需要二次檢查

單例六

public class mysingleton   

public static mysingleton getinstance()

} }

} catch (interruptedexception e)

return instance;

} }

這種情況下才能保證每次列印出來的物件都是同乙個物件。但是以上我們介紹的所有的實現方式,在序列化和反序列化的時候,是否還能保證物件相同,我們看下測試**

public static void main(string args)  catch (filenotfoundexception e)  catch (ioexception e) 

try catch (filenotfoundexception e) catch (ioexception e) catch (classnotfoundexception e)

}

這時候列印出來結果hash值並不相同,所以之前的單例實現還需繼續修改,在mysingleton方法當中實現readresolve方法即可

//該方法在反序列化時會被呼叫,該方法不是介面定義的方法,有點兒約定俗成的感覺  

protected object readresolve() throws objectstreamexception

單例七

使用靜態內部類

public class mysingleton implements serializable    

private mysingleton(){}

public static mysingleton getinstance()

}

靜態內部類不需要加鎖,同時也能保證執行緒安全而且也不會浪費記憶體空間,原因在於,外部類在初始化的時候,如果沒有使用到內部類,是不會對內部類進行初始化,只有當我們顯示呼叫靜態內部的靜態變數或者靜態方法時,才會對靜態內部類進行初始化。

這裡沒有給出列舉的實現方式。

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...