
NightRain.png
定義
保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。
使用場(chǎng)景
- 整個(gè)項(xiàng)目需要一個(gè)共享訪問(wèn)點(diǎn)或數(shù)據(jù)
- 創(chuàng)建一個(gè)對(duì)象需要消耗的資源過(guò)多,比如訪問(wèn)I/0或者數(shù)據(jù)庫(kù)等資源
- 工具類(lèi)對(duì)象
示例
1. 餓漢式
public class SingleInstance {
/**
* 餓漢式
* 線程:安全
* 優(yōu)點(diǎn):基于類(lèi)加載機(jī)制,獲取對(duì)象快
* 缺點(diǎn):由于在加載中就完成實(shí)例化,如果未使用這個(gè)實(shí)例,會(huì)造成內(nèi)存浪費(fèi)
*/
private static SingleInstance mSingleInstance = new SingleInstance();
private SingleInstance() {
}
public static SingleInstance getInstance() {
return mSingleInstance;
}
}
2. 懶漢式
public class SingleInstance {
/**
* 懶漢式
* 線程:不安全
* 優(yōu)點(diǎn):節(jié)約內(nèi)存資源,只有第一次調(diào)用才會(huì)實(shí)例化
* 缺點(diǎn):第一次加載相對(duì)餓漢式慢一些,并且多線程可能無(wú)法正常工作
*/
private static SingleInstance mSingleInstance = null;
private SingleInstance() {
}
public static SingleInstance getInstance() {
if (mSingleInstance == null) {
mSingleInstance = new SingleInstance();
}
return mSingleInstance;
}
}
3. 雙重檢查模式
public class SingleInstance {
/**
* 雙重檢查模式
* 線程:安全
* 優(yōu)點(diǎn):資源利用率高,只有第一次使用才會(huì)實(shí)例化
* 缺點(diǎn):第一次加載稍慢
*/
private static volatile SingleInstance mSingleInstance = null;
private SingleInstance() {
}
public static SingleInstance getInstance() {
if (mSingleInstance == null) {
synchronized (SingleInstance.class) {
if (mSingleInstance == null) {
mSingleInstance = new SingleInstance();
}
}
}
return mSingleInstance;
}
}
4. 靜態(tài)內(nèi)部類(lèi)單例模式
public class SingleInstance {
/**
* 靜態(tài)內(nèi)部類(lèi)
* 線程:安全
* 優(yōu)點(diǎn):在保證線程安全的同時(shí),基本沒(méi)有性能損耗
* 推薦使用靜態(tài)內(nèi)部類(lèi)做單例
*/
private SingleInstance() {
}
public static SingleInstance getInstance() {
return SingleInstanceHolder.sSingleInstance;
}
private static class SingleInstanceHolder {
private static final SingleInstance sSingleInstance = new SingleInstance();
}
}