1、餓漢模式
聲明靜態(tài)對(duì)象的時(shí)候初始化
public class SingleInstance {
private static SingleInstance INSTANCE=new SingleInstance();
private SingleInstance() {}
public static SingleInstance getInstance(){
return INSTANCE;
}
}
但是,因?yàn)轭愒诘谝淮问褂玫臅r(shí)候會(huì)被加載到內(nèi)存(如果此時(shí)沒有調(diào)用 getInstance() ),因?yàn)? instance 是靜態(tài)變量,也會(huì)導(dǎo)致單例對(duì)象被創(chuàng)建。
2、懶漢模式
當(dāng)類第一次獲取單例對(duì)象的時(shí)候初始化
public class SingleInstance {
private static SingleInstance INSTANCE;
private SingleInstance() {}
public static SingleInstance getInstance(){
if (INSTANCE==null){
INSTANCE=new SingleInstance();
}
return INSTANCE;
}
}
當(dāng)然,在單線程的環(huán)境下,是沒有問題的,但是如果,多線程并發(fā)訪問,就會(huì)創(chuàng)建多個(gè)SingleInstance對(duì)象,這個(gè)時(shí)候,可以使用synchronized進(jìn)行線程同步。
private static SingleInstance INSTANCE;
private SingleInstance() {}
public static synchronized SingleInstance getInstance(){
if (INSTANCE==null){
INSTANCE=new SingleInstance();
}
return INSTANCE;
}
但是,即便INSTANCE已經(jīng)存在了,每次調(diào)用 getInstance()方法,都會(huì)進(jìn)行同步,會(huì)降低程序的效率,可以使用同步代碼塊,同步關(guān)鍵代碼
public class SingleInstance {
private static SingleInstance INSTANCE;
private SingleInstance() {}
public static SingleInstance getInstance(){
if (INSTANCE==null){
synchronized (SingleInstance.class){
if(INSTANCE==null){
INSTANCE=new SingleInstance();
}
}
}
return INSTANCE;
}
}
3、靜態(tài)內(nèi)部類
關(guān)于內(nèi)部類
把一個(gè)類放到另一個(gè)類的內(nèi)部定義,就是內(nèi)部類。
- 靜態(tài)內(nèi)部類:如果成員內(nèi)部類使用static修飾,就是靜態(tài)內(nèi)部類。
- 匿名內(nèi)部類:如果一個(gè)類只需要使用一次,可以使用匿名內(nèi)部類。創(chuàng)建匿名內(nèi)部類時(shí),會(huì)立即創(chuàng)建一個(gè)該類的實(shí)例。
記住下面幾個(gè)規(guī)則:
- 靜態(tài)成員(類相關(guān))不能訪問非靜態(tài)成員(對(duì)象相關(guān)):外部類的靜態(tài)方法,不能訪問非靜態(tài)內(nèi)部類,即便只是調(diào)用構(gòu)造器也不行,因?yàn)榉庆o態(tài)內(nèi)部類創(chuàng)建對(duì)象的時(shí)候,需要依賴一個(gè)外部類對(duì)象,此時(shí)它所依賴的外部對(duì)象還不存在。
- 靜態(tài)內(nèi)部類的實(shí)例方法,不能訪問外部類的實(shí)例方法,因?yàn)殪o態(tài)內(nèi)部類是外部類相關(guān)的,創(chuàng)建靜態(tài)內(nèi)部類對(duì)象的時(shí)候,無(wú)需創(chuàng)建外部類對(duì)象,此時(shí),外部類對(duì)象還不存在。
創(chuàng)建對(duì)象
- 普通內(nèi)部類
new out().new in() - 靜態(tài)內(nèi)部類
new out.in()
因?yàn)閮?nèi)部類,直到使用的時(shí)候才加載,即第一次調(diào)用SingleInstanceHolder.INSTANCE時(shí),SingleInstance才會(huì)創(chuàng)建
public class SingleInstance {
private SingleInstance() {}
public static SingleInstance getInstance(){
return SingleInstanceHolder.INSTANCE;
}
private static class SingleInstanceHolder{
static SingleInstance INSTANCE=new SingleInstance();
}
}