2016-07-28 00:10:14
懶漢式:
class text
{ public String k;
private static text t=null;//右邊代碼結構比上邊餓漢式繁瑣,可能出現安全問題
private test(){} //安全問題無疑是違背這個程序的初衷就是可以創建多個實例
public static text getObject()
{ //多線程的時候,運行狀態到就緒狀態(簡單的說就是線程失去了CPU的執行權)
if (t==null)
{ //---------->到就緒區 Tread1,Tread2依次臥倒(線程失去了CPU的執行權)
t=new text(); //顯而易見以上兩個線程創建了兩個實例
return t; //在cup負荷時候進程多而線程為進程的執行單位在切換時可能出現以上情況
}
return t;
}
}
//那麼如何解決以上問題
代碼如下:
class test
{ public String k;
private static text t=null;
private test(){}
public static text getObject()
{
if (t==null)
//外面新增一個判斷為一旦生成一個對象後就不在判斷鎖的問題
// 來優化代碼(節省時間)
{ synchronized(test.class){ //在此有鎖,只能進入一個線程就不會出現 多個線程創建多個實例
if(t==null){
t=new text(); // 補充:因為此時方法為靜態不能調用this,
return t; //所以調用已經生成的類名.class 字節碼對象;
//下面有更詳細對test.class補充
}
}
}
return t;
}
-------------------------------------------------------我是分隔符---------------------------------------------------
補充:
單例模式:
餓漢式:
/*餓漢式*/
/*class test
{ public String k;
private static final text t=new text();//正規寫法把final 寫上 成為一個不可以改變的常量
private text(){}
public static text getObject(){
return t; //在加載的類的時候就生成了對象,代碼結構簡單基本不存在安全問題
//在加載類時要比懶漢式要費時長,調用對象時比懶漢式時間段
}
類名.class,你可以理解為字節碼本身就是靜態的,類加載的時字節碼就進JVM了。所以類.class好比類調用靜態方法似得調用字節碼對象。
------------------------------------說明----------------------------------------------------------------------------------------------------------------
本人不過大一學生,第一次寫學習感悟.以上如果程序有問題或者描述不清請留言謝謝.
如果大家有更好的方法希望互相學習共同進步.ljs.