書上對單例模式的定義:
保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件,乙個最好的辦法就是,讓類自身負責儲存它的唯一例項,這個類可以保證沒有其他例項可以被建立,並且它可以提供乙個訪問該例項的方法。
這裡我想跟大家說下我在書上看到一句話,當我們在構建軟體的世界中遇到問題時,我們從現實生活中尋找答案,以及現實生活中很多的可行解,都能從軟體的世界中得到啟發。大家共勉。
首先防止new 把類的構造方法宣告為private, 這樣外部就不能通過new來構建新的例項了。其次提供乙個全域性訪問點,即宣告乙個用static修飾獲取的方法來訪問。
第一種單例,這種方法又叫做懶漢式,執行緒不安全的。
public class singleton1
public static singleton1 getinstance()
return instance;
}}
測試
public static void main(string args)
結果:true
第二種,對第一種方法進行改進,使讓其執行緒安全於是進行加鎖,這樣就防止多個執行緒越過if==null的情況,再多次建立執行緒。
public class singleton2
public static singleton2 getinstance()
}return instance;
}}
測試:
public class main extends thread
public static void main(string args)
}}結果:
2124340618
2124340618
2124340618
2124340618
2124340618
2124340618 //代表執行緒安全,實現了單例
上面這種效能降低了。為了增加點效能,於是將鎖的粒度精細,但是,要預防死鎖。
第三種: 採用網上的雙重檢測判空但是這個不一定保證對,因為不是原子操作。所以多個執行緒操作第一判斷非null時可能會直接返回乙個還未分配完記憶體的位址。解決辦法是給變數加上volatile.
public class singleton3
public static singleton3 getinstance()}}
return instance;
}}
測試:測試**和上面一樣
1372676747
1372676747
1372676747
1372676747
1372676747
1372676747
第四種,推薦網上的靜態內部類的方法
public class singleton4
private static class singletoninner
public static final singleton4 getinstance()
}
測試**不附上了。
同時為什麼這個模式能保證延遲初始化,又能保證單例,保證執行緒安全,根據虛擬機器規範來保證。請參考:
還有一種方法,即通過類的初始化來保證單例
public class singleton5
static
public static singleton5 getinstance()
}
最後一種就是列舉來實現
列舉實現,每個例項預設都是static final的.
public
class
single
private single getinstance()
}public
static single getinstance()
public
static
void
main
(string[
] args)
結果:a==btrue 設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...