----------------------
ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
一.單例設計模式
* 單例設計模式的體現
* 需求:爲了保證一個類在內存中只能夠存在一個對象
* 方法步驟:
* 1、首先對此類構造函數進行私有化
* 2、構造函數私有化以後,外界就不能夠創建對象了,那麼只能在本類中自定義對象
* 3、想要外界訪問到本類自定義對象的話,那麼就需要提供訪問方法
* 4、外界想要訪問本類,因爲不能夠創建對象,所以必須通過類名.方法名的方式訪問,那麼本類中的方法就必須定義爲static
* 5、因爲本類中方法定義成了靜態,而靜態成員不能夠訪問非靜態成員,所以對象也必須靜態修飾
* 6、然後當調用了方法時,可以通過返回該類對象的方式獲取到對象
* 7、然後定義一個變量進行接收
* 8、此時該變量的內存地址值就是s對象的內存地址值,指向堆內存中的new Single();
代碼示例:
//餓漢式
public class Dan_li_she_ji {
public static void main(String[] args) {
Single s1 = Single.getInstance();
s1.setName("張三");
System.out.println(s1.getName());
Single s2 = Single.getInstance(); //這並沒有創建對象,而是定義了一個新的變量,所指向的仍然是s對象
s2.setName("李四"); //s2更改了name的值,那麼s1、s2訪問到得name值都是“李四”
System.out.println(s1.getName()); //現在s1、s2內存地址值一樣,所指向的對象都爲s
System.out.println(s2.getName());
}
}
class Single{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
private Single(){}
private static final Single s = new Single();
public static Single getInstance(){
return s;
}
}
//懶漢式
class Single3{
private Single3(){}
private static Single3 s = null;
public static Single3 getInstance(){
if(s==null){
s = new Single3();
}
return s;
}
}
* 餓漢式與懶漢式比較
* 區別:
* 1、餓漢式是在類加載到內存時對象就已經創建了;餓漢式只有當調用了getInstance方法時才創建對象
* 2、懶漢式的特點是對象的延遲加載
*
*
* 重點:當懶漢式遭遇多線程運行時會出現問題
* 問題:當一個線程執行了if語句後,在這兒停下了,這時候另一個線程執行了if語句,
* 第一個線程這時候又開始運行,創建了一個對象,第二個線程繼續運行,又創建了一個對象
* 這時候就不符合程序對象的唯一性了
* 解決辦法:
* 1、把getInstance方法用synchronized修飾,這樣雖然可以避免創建多個對象,可是存在弊端
* 每一個線程進來的時候都需要先判斷鎖是不是開着來,這樣很耗費資源
*
* 最佳解決辦法:
* 1、把線程所執行的共享數據if語句synchronized,因爲getInstance語句是靜態的,所以這時候的鎖是Single1.class字節碼文件
* 這樣仍然存在弊端,因爲每一個線程進來仍然需要判斷鎖的狀態,這時候在synchronized語句上加上if(s==null),
* 這樣的話當第一個線程執行到一半停止了,那麼第二個線程進不去,當第一個線程執行完畢,第二個線程仍然進不去,後面所有的
* 線程都不需要讀取鎖的狀態,這樣節省資源
代碼示例:
public class Dan_li_she_ji_bijiao {
}
//餓漢式
class Single1{
private Single1(){}
private static final Single1 s = new Single1();
public static Single1 getInstance(){
return s;
}
}
//懶漢式(延遲加載的單例設計模式)
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null){
synchronized(Single2.class){
if(s==null){
s = new Single2();
}
}
}
return s;
}
}
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net