首先來分析如下單例模式所存在的問題
餓漢式單例模式
測試**:
public class syndemo01 ;
};thread t2=new thread("thread2");
};t1.start();
t2.start();
} }
單例jvm
class jvm
public static jvm getjvm(int time)
catch (interruptedexception e)
instance=new jvm();
}return instance;
}}
測試結果
com.txr.thread.jvm@263c8db9
com.txr.thread.jvm@517c804b
我們發現在多執行緒之下,竟然例項化了倆個物件
對**加以改進
單例jvm
class jvm
public static jvm getjvm(int time)
catch (interruptedexception e)
instance=new jvm();}}
return instance;
}}
測試結果
com.txr.thread.jvm@517c804b
com.txr.thread.jvm@517c804b
發現多執行緒下的單例是實現了,但是效率卻不高,進行如下改進
class jvm
public static jvm getjvm(int time)
catch (interruptedexception e)
instance=new jvm();}}
}return instance;
}}
測試結果
com.txr.thread.jvm@517c804b
com.txr.thread.jvm@517c804b
發現效率提高(從等待時間來看)因為在第乙個多執行緒下的單例模式中,每乙個物件進行判斷都需要等待,而第二個多執行緒的單例模式中,當第乙個例項化後第二個則無需等待了,這樣能大大提高效率
餓漢式的多執行緒下的單例模式
//餓漢式
class jvm2
public static jvm2 getjvm3(int time)
}
很顯然在餓漢式的單例模式中不會在多執行緒的情況下出現問題,因為在類被載入時就已經建立好了例項只需要返回
那麼如何進行優化呢?
//餓漢式
class jvm3
private jvm3()
public static jvm3 getjvm3(int time)
}
將例項化的物件放入內部類中,由類的載入性質我們可以知道這個例項只有在需要的時候才會被建立,這樣做的好處就是延緩了載入時間,只有在用到的時候才會被載入.
多執行緒下的單例模式
單例模式分為兩種 懶漢單例模式和餓漢式單例模式 public class singleton private static singleton single null public static singleton getinstance return single 在單執行緒中,這樣寫,不會存在任...
多執行緒下的單例模式
在多執行緒下的singleton模式是有弊端的,但如何解決呢?辦法是使用lock機制。今天研究的lock機制,並且順便了解了些關於多執行緒的cpu層面的機制。在單個cpu的環境下,在系統的某一時間下cpu只能做一件事情,乙個時間片 slice 這個是cpu執行最小單位。在系統中有多個程序看起來好像是...
多執行緒 單例模式
單例模式 是非常典型常用的一種設計模式 乙份資源只能被申 載一次 單例模式的方法建立的類在當前程序中只有乙個例項 資源的程式初始化的時候就去載入,後面使用的時候直接使用,使用的時候比較流暢,有可能會載入用不上的資源,導致程式初始化時間比較慢。include class single instance...